import { logger } from '@server/helpers/logger'
-import { getTargetBitrate } from '../../shared/models/videos'
+import { getTargetBitrate, VideoResolution } from '../../shared/models/videos'
import { AvailableEncoders, buildStreamSuffix, EncoderOptionsBuilder } from '../helpers/ffmpeg-utils'
import {
canDoQuickAudioTranscode,
// * https://trac.ffmpeg.org/wiki/Limiting%20the%20output%20bitrate
const defaultX264VODOptionsBuilder: EncoderOptionsBuilder = async ({ input, resolution, fps }) => {
- let targetBitrate = getTargetBitrate(resolution, fps, VIDEO_TRANSCODING_FPS)
-
- const probe = await ffprobePromise(input)
-
- const videoStream = await getVideoStreamFromFile(input, probe)
- if (!videoStream) {
- return { outputOptions: [ ] }
- }
-
- // Don't transcode to an higher bitrate than the original file
- const fileBitrate = await getVideoFileBitrate(input, probe)
- targetBitrate = Math.min(targetBitrate, fileBitrate)
+ const targetBitrate = await buildTargetBitrate({ input, resolution, fps })
+ if (!targetBitrate) return { outputOptions: [ ] }
return {
outputOptions: [
+ `-r ${fps}`,
`-maxrate ${targetBitrate}`,
`-bufsize ${targetBitrate * 2}`
]
return {
outputOptions: [
+ `${buildStreamSuffix('-r:v', streamNum)} ${fps}`,
`${buildStreamSuffix('-b:v', streamNum)} ${targetBitrate}`,
`-maxrate ${targetBitrate}`,
`-bufsize ${targetBitrate * 2}`
}
// ---------------------------------------------------------------------------
+async function buildTargetBitrate (options: {
+ input: string
+ resolution: VideoResolution
+ fps: number
+}) {
+ const { input, resolution, fps } = options
+ const probe = await ffprobePromise(input)
+
+ const videoStream = await getVideoStreamFromFile(input, probe)
+ if (!videoStream) return undefined
+
+ const targetBitrate = getTargetBitrate(resolution, fps, VIDEO_TRANSCODING_FPS)
+
+ // Don't transcode to an higher bitrate than the original file
+ const fileBitrate = await getVideoFileBitrate(input, probe)
+ return Math.min(targetBitrate, fileBitrate)
+}