添加VAAPI的支持
This commit is contained in:
@@ -43,6 +43,7 @@
|
|||||||
<option value="software">Software</option>
|
<option value="software">Software</option>
|
||||||
<option value="nvidia">NVIDIA</option>
|
<option value="nvidia">NVIDIA</option>
|
||||||
<option value="intel">Intel</option>
|
<option value="intel">Intel</option>
|
||||||
|
<option value="vaapi">VAAPI</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div id="loading-spinner" class="spinner-container">
|
<div id="loading-spinner" class="spinner-container">
|
||||||
|
|||||||
17
server.js
17
server.js
@@ -73,6 +73,8 @@ const createFfmpegOptions = (encoderName) => {
|
|||||||
options.push('-rc:v', 'vbr_hq', '-cq', '19');
|
options.push('-rc:v', 'vbr_hq', '-cq', '19');
|
||||||
} else if (/_qsv$/.test(encoderName)) {
|
} else if (/_qsv$/.test(encoderName)) {
|
||||||
options.push('-global_quality', '23');
|
options.push('-global_quality', '23');
|
||||||
|
} else if (/_vaapi$/.test(encoderName)) {
|
||||||
|
options.push('-qp', '23');
|
||||||
}
|
}
|
||||||
return options;
|
return options;
|
||||||
};
|
};
|
||||||
@@ -161,11 +163,12 @@ app.post('/api/transcode', async (req, res) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const safeCodec = codec === 'h265' ? 'h265' : 'h264';
|
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 = {
|
const codecMap = {
|
||||||
software: { h264: 'libx264', h265: 'libx265' },
|
software: { h264: 'libx264', h265: 'libx265' },
|
||||||
nvidia: { h264: 'h264_nvenc', h265: 'hevc_nvenc' },
|
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];
|
const videoCodec = codecMap[safeEncoder][safeCodec];
|
||||||
|
|
||||||
@@ -247,10 +250,16 @@ app.post('/api/transcode', async (req, res) => {
|
|||||||
let attemptedSoftwareFallback = false;
|
let attemptedSoftwareFallback = false;
|
||||||
const startFfmpeg = (encoderName) => {
|
const startFfmpeg = (encoderName) => {
|
||||||
console.log(`Starting ffmpeg with encoder ${encoderName} for ${key}`);
|
console.log(`Starting ffmpeg with encoder ${encoderName} for ${key}`);
|
||||||
ffmpeg(tmpInputPath)
|
const command = ffmpeg(tmpInputPath)
|
||||||
.videoCodec(encoderName)
|
.videoCodec(encoderName)
|
||||||
.audioCodec('aac')
|
.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')
|
.format('mp4')
|
||||||
.output(mp4Path)
|
.output(mp4Path)
|
||||||
.on('progress', (progress) => {
|
.on('progress', (progress) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user