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) => {