X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Ftranscoding%2Fvideo-transcoding-profiles.ts;h=34a364415efdcd62a49c65591a98b8421676d004;hb=63a3d336f6cc9a293a07fdc12d6bdfb86cfc2fd5;hp=2309f38d475d1d42446b4221a5c2b980e5c778c6;hpb=c826f34a45757b324a20f71665b44ed10e6953b5;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/transcoding/video-transcoding-profiles.ts b/server/lib/transcoding/video-transcoding-profiles.ts index 2309f38d4..34a364415 100644 --- a/server/lib/transcoding/video-transcoding-profiles.ts +++ b/server/lib/transcoding/video-transcoding-profiles.ts @@ -1,23 +1,25 @@ + import { logger } from '@server/helpers/logger' -import { AvailableEncoders, EncoderOptionsBuilder, getTargetBitrate, VideoResolution } from '../../../shared/models/videos' +import { getAverageBitrate, getMinLimitBitrate } from '@shared/core-utils' +import { AvailableEncoders, EncoderOptionsBuilder, EncoderOptionsBuilderParams, VideoResolution } from '../../../shared/models/videos' import { buildStreamSuffix, resetSupportedEncoders } from '../../helpers/ffmpeg-utils' import { canDoQuickAudioTranscode, ffprobePromise, getAudioStream, getMaxAudioBitrate } from '../../helpers/ffprobe-utils' -import { VIDEO_TRANSCODING_FPS } from '../../initializers/constants' /** * * Available encoders and profiles for the transcoding jobs * These functions are used by ffmpeg-utils that will get the encoders and options depending on the chosen profile * + * Resources: + * * https://slhck.info/video/2017/03/01/rate-control.html + * * https://trac.ffmpeg.org/wiki/Limiting%20the%20output%20bitrate */ -// Resources: -// * https://slhck.info/video/2017/03/01/rate-control.html -// * https://trac.ffmpeg.org/wiki/Limiting%20the%20output%20bitrate +const defaultX264VODOptionsBuilder: EncoderOptionsBuilder = (options: EncoderOptionsBuilderParams) => { + const { fps, inputRatio, inputBitrate, resolution } = options + if (!fps) return { outputOptions: [ ] } -const defaultX264VODOptionsBuilder: EncoderOptionsBuilder = async ({ inputBitrate, resolution, fps }) => { - const targetBitrate = buildTargetBitrate({ inputBitrate, resolution, fps }) - if (!targetBitrate) return { outputOptions: [ ] } + const targetBitrate = getTargetBitrate({ inputBitrate, ratio: inputRatio, fps, resolution }) return { outputOptions: [ @@ -29,8 +31,10 @@ const defaultX264VODOptionsBuilder: EncoderOptionsBuilder = async ({ inputBitrat } } -const defaultX264LiveOptionsBuilder: EncoderOptionsBuilder = async ({ resolution, fps, inputBitrate, streamNum }) => { - const targetBitrate = buildTargetBitrate({ inputBitrate, resolution, fps }) +const defaultX264LiveOptionsBuilder: EncoderOptionsBuilder = (options: EncoderOptionsBuilderParams) => { + const { streamNum, fps, inputBitrate, inputRatio, resolution } = options + + const targetBitrate = getTargetBitrate({ inputBitrate, ratio: inputRatio, fps, resolution }) return { outputOptions: [ @@ -62,7 +66,7 @@ const defaultAACOptionsBuilder: EncoderOptionsBuilder = async ({ input, streamNu logger.debug('Calculating audio bitrate of %s by AAC encoder.', input, { bitrate: parsedAudio.bitrate, audioCodecName }) - if (bitrate !== undefined && bitrate !== -1) { + if (bitrate !== -1) { return { outputOptions: [ buildStreamSuffix('-b:a', streamNum), bitrate + 'k' ] } } @@ -231,15 +235,25 @@ export { // --------------------------------------------------------------------------- -function buildTargetBitrate (options: { +function getTargetBitrate (options: { inputBitrate: number resolution: VideoResolution + ratio: number fps: number }) { - const { inputBitrate, resolution, fps } = options + const { inputBitrate, resolution, ratio, fps } = options + + const capped = capBitrate(inputBitrate, getAverageBitrate({ resolution, fps, ratio })) + const limit = getMinLimitBitrate({ resolution, fps, ratio }) - const targetBitrate = getTargetBitrate(resolution, fps, VIDEO_TRANSCODING_FPS) + return Math.max(limit, capped) +} + +function capBitrate (inputBitrate: number, targetBitrate: number) { if (!inputBitrate) return targetBitrate - return Math.min(targetBitrate, inputBitrate) + // Add 30% margin to input bitrate + const inputBitrateWithMargin = inputBitrate + (inputBitrate * 0.3) + + return Math.min(targetBitrate, inputBitrateWithMargin) }