From 14857212f15256ff4dd0d36ff5158005f1d7caae Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 14 Dec 2021 10:39:52 +0100 Subject: Move b frame strategy in transcoding profile We may use a too high value for some encoders and it allows to specify custom values/strategy --- server/helpers/ffmpeg-utils.ts | 18 ++++++--------- .../lib/transcoding/video-transcoding-profiles.ts | 27 +++++++++++++++------- 2 files changed, 26 insertions(+), 19 deletions(-) (limited to 'server') diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts index ab29d4691..78ee5fa7f 100644 --- a/server/helpers/ffmpeg-utils.ts +++ b/server/helpers/ffmpeg-utils.ts @@ -287,8 +287,8 @@ async function getLiveTranscodingCommand (options: { addDefaultEncoderParams({ command, encoder: builderResult.encoder, fps: resolutionFPS, streamNum: i }) logger.debug( - 'Apply ffmpeg live video params from %s using %s profile.', builderResult.encoder, profile, builderResult, - { fps: resolutionFPS, resolution, ...lTags() } + 'Apply ffmpeg live video params from %s using %s profile.', builderResult.encoder, profile, + { builderResult, fps: resolutionFPS, resolution, ...lTags() } ) command.outputOption(`${buildStreamSuffix('-c:v', i)} ${builderResult.encoder}`) @@ -314,8 +314,8 @@ async function getLiveTranscodingCommand (options: { addDefaultEncoderParams({ command, encoder: builderResult.encoder, fps: resolutionFPS, streamNum: i }) logger.debug( - 'Apply ffmpeg live audio params from %s using %s profile.', builderResult.encoder, profile, builderResult, - { fps: resolutionFPS, resolution, ...lTags() } + 'Apply ffmpeg live audio params from %s using %s profile.', builderResult.encoder, profile, + { builderResult, fps: resolutionFPS, resolution, ...lTags() } ) command.outputOption(`${buildStreamSuffix('-c:a', i)} ${builderResult.encoder}`) @@ -368,10 +368,6 @@ function addDefaultEncoderGlobalParams (options: { command.outputOption('-max_muxing_queue_size 1024') // strip all metadata .outputOption('-map_metadata -1') - // NOTE: b-strategy 1 - heuristic algorithm, 16 is optimal B-frames for it - .outputOption('-b_strategy 1') - // NOTE: Why 16: https://github.com/Chocobozzz/PeerTube/pull/774. b-strategy 2 -> B-frames<16 - .outputOption('-bf 16') // allows import of source material with incompatible pixel formats (e.g. MJPEG video) .outputOption('-pix_fmt yuv420p') } @@ -627,8 +623,8 @@ async function presetVideo (options: { logger.debug( 'Apply ffmpeg params from %s for %s stream of input %s using %s profile.', - builderResult.encoder, streamType, input, profile, builderResult, - { resolution, fps, ...lTags() } + builderResult.encoder, streamType, input, profile, + { builderResult, resolution, fps, ...lTags() } ) if (streamType === 'video') { @@ -734,7 +730,7 @@ async function runCommand (options: { command.on('start', cmdline => { shellCommand = cmdline }) command.on('error', (err, stdout, stderr) => { - if (silent !== true) logger.error('Error in ffmpeg.', { stdout, stderr, ...lTags() }) + if (silent !== true) logger.error('Error in ffmpeg.', { stdout, stderr, shellCommand, ...lTags() }) rej(err) }) diff --git a/server/lib/transcoding/video-transcoding-profiles.ts b/server/lib/transcoding/video-transcoding-profiles.ts index 34a364415..dcc8d4c5c 100644 --- a/server/lib/transcoding/video-transcoding-profiles.ts +++ b/server/lib/transcoding/video-transcoding-profiles.ts @@ -23,10 +23,9 @@ const defaultX264VODOptionsBuilder: EncoderOptionsBuilder = (options: EncoderOpt return { outputOptions: [ - `-preset veryfast`, - `-r ${fps}`, - `-maxrate ${targetBitrate}`, - `-bufsize ${targetBitrate * 2}` + ...getCommonOutputOptions(targetBitrate), + + `-r ${fps}` ] } } @@ -38,11 +37,10 @@ const defaultX264LiveOptionsBuilder: EncoderOptionsBuilder = (options: EncoderOp return { outputOptions: [ - `-preset veryfast`, + ...getCommonOutputOptions(targetBitrate), + `${buildStreamSuffix('-r:v', streamNum)} ${fps}`, - `${buildStreamSuffix('-b:v', streamNum)} ${targetBitrate}`, - `-maxrate ${targetBitrate}`, - `-bufsize ${targetBitrate * 2}` + `${buildStreamSuffix('-b:v', streamNum)} ${targetBitrate}` ] } } @@ -257,3 +255,16 @@ function capBitrate (inputBitrate: number, targetBitrate: number) { return Math.min(targetBitrate, inputBitrateWithMargin) } + +function getCommonOutputOptions (targetBitrate: number) { + return [ + `-preset veryfast`, + `-maxrate ${targetBitrate}`, + `-bufsize ${targetBitrate * 2}`, + + // NOTE: b-strategy 1 - heuristic algorithm, 16 is optimal B-frames for it + `-b_strategy 1`, + // NOTE: Why 16: https://github.com/Chocobozzz/PeerTube/pull/774. b-strategy 2 -> B-frames<16 + `-bf 16` + ] +} -- cgit v1.2.3