diff --git a/public/index.html b/public/index.html index f53306f..4149c3d 100644 --- a/public/index.html +++ b/public/index.html @@ -43,6 +43,7 @@ +
diff --git a/server.js b/server.js index 70eeacc..a57a641 100644 --- a/server.js +++ b/server.js @@ -73,6 +73,8 @@ const createFfmpegOptions = (encoderName) => { options.push('-rc:v', 'vbr_hq', '-cq', '19'); } else if (/_qsv$/.test(encoderName)) { options.push('-global_quality', '23'); + } else if (/_vaapi$/.test(encoderName)) { + options.push('-qp', '23'); } return options; }; @@ -161,11 +163,12 @@ app.post('/api/transcode', async (req, res) => { } const safeCodec = codec === 'h265' ? 'h265' : 'h264'; - const safeEncoder = ['nvidia', 'intel'].includes(encoder) ? encoder : 'software'; + const safeEncoder = ['nvidia', 'intel', 'vaapi'].includes(encoder) ? encoder : 'software'; const codecMap = { software: { h264: 'libx264', h265: 'libx265' }, nvidia: { h264: 'h264_nvenc', h265: 'hevc_nvenc' }, - intel: { h264: 'h264_qsv', h265: 'hevc_qsv' } + intel: { h264: 'h264_qsv', h265: 'hevc_qsv' }, + vaapi: { h264: 'h264_vaapi', h265: 'hevc_vaapi' } }; const videoCodec = codecMap[safeEncoder][safeCodec]; @@ -247,10 +250,16 @@ app.post('/api/transcode', async (req, res) => { let attemptedSoftwareFallback = false; const startFfmpeg = (encoderName) => { console.log(`Starting ffmpeg with encoder ${encoderName} for ${key}`); - ffmpeg(tmpInputPath) + const command = ffmpeg(tmpInputPath) .videoCodec(encoderName) .audioCodec('aac') - .outputOptions(createFfmpegOptions(encoderName)) + .outputOptions(createFfmpegOptions(encoderName)); + if (/_vaapi$/.test(encoderName)) { + command + .inputOptions(['-vaapi_device', '/dev/dri/renderD128']) + .videoFilters('format=nv12,hwupload'); + } + command .format('mp4') .output(mp4Path) .on('progress', (progress) => {