From 5192a3b23f2ffa17f7beef65f222f3b2c6e67e99 Mon Sep 17 00:00:00 2001 From: CN-JS-HuiBai Date: Thu, 2 Apr 2026 19:09:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0VAAPI=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/index.html | 1 + server.js | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) 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) => {