From f322b45ee12573ae8cf67515471687191e7e50ac Mon Sep 17 00:00:00 2001 From: waveringana Date: Sun, 29 Oct 2023 17:53:21 -0400 Subject: [PATCH] add encoding choice --- app/types/middleware.ts | 36 +++++++++++++++++++++++++++++++++++- tests/ffmpeg.ts | 23 ++++++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/app/types/middleware.ts b/app/types/middleware.ts index 3ab4988..ac41be9 100644 --- a/app/types/middleware.ts +++ b/app/types/middleware.ts @@ -38,7 +38,7 @@ import {db, MediaParams, insertToDB} from "./db"; enum EncodingType { CPU = 'libx264', NVIDIA = 'h264_nvenc', - AMD = 'h264_vmf', + AMD = 'h264_amf', INTEL = 'h264_qsv', APPLE = 'h264_videotoolbox' } @@ -49,6 +49,20 @@ export const setEncodingType = (type: EncodingType) => { currentEncoding = type; }; +export const checkEnvForEncoder = () => { + const envEncoder = process.env.EB_ENCODER?.toUpperCase(); + + if (envEncoder && Object.keys(EncodingType).includes(envEncoder)) { + setEncodingType(EncodingType[envEncoder as keyof typeof EncodingType] as EncodingType); + console.log(`Setting encoding type to ${envEncoder} based on environment variable.`); + } else if (envEncoder) { + //I finally understand DHH + console.warn(`Invalid encoder value "${envEncoder}" in environment variable, defaulting to ${Object.keys(EncodingType).find(key => EncodingType[key as keyof typeof EncodingType] === currentEncoding)}.`); + } +}; + +checkEnvForEncoder(); + export const checkAuth: Middleware = (req, res, next) => { if (!req.user) { return res.status(401); @@ -172,6 +186,26 @@ export const convertTo720p: Middleware = (req, res, next) => { '-c:v', currentEncoding, ]; + // Adjust output options based on encoder for maximum quality + switch(currentEncoding) { + case EncodingType.CPU: + outputOptions.push('-crf', '0'); + break; + case EncodingType.NVIDIA: + outputOptions.push('-rc', 'cqp', '-qp', '0'); + break; + case EncodingType.AMD: + outputOptions.push('-qp_i', '0', '-qp_p', '0', '-qp_b', '0'); + break; + case EncodingType.INTEL: + outputOptions.push('-global_quality', '1'); // Intel QSV specific setting for high quality + break; + case EncodingType.APPLE: + outputOptions.push('-global_quality', '1'); + break; + } + + ffmpeg() .input(`uploads/${nameAndExtension[0]}${nameAndExtension[1]}`) .inputFormat('mp4') diff --git a/tests/ffmpeg.ts b/tests/ffmpeg.ts index 84445d7..d07a953 100644 --- a/tests/ffmpeg.ts +++ b/tests/ffmpeg.ts @@ -27,7 +27,7 @@ ffmpeg.setFfprobePath(ffprobePath!); export enum EncodingType { CPU = 'libx264', NVIDIA = 'h264_nvenc', - AMD = 'h264_vmf', + AMD = 'h264_amf', INTEL = 'h264_qsv', APPLE = 'h264_videotoolbox', } @@ -40,8 +40,29 @@ export const generateTestVideo = async (encodingType: EncodingType): Promise((resolve, reject) => { ffmpeg() .input('test.mp4')