1
0
Fork 0
mirror of https://github.com/Chocobozzz/PeerTube.git synced 2025-10-04 02:09:37 +02:00

Fix live FPS limit

This commit is contained in:
Chocobozzz 2020-11-26 11:29:50 +01:00
parent 0151c41c65
commit 884d2c39ae
No known key found for this signature in database
GPG key ID: 583A612D890159BE
5 changed files with 68 additions and 42 deletions

View file

@ -1,5 +1,5 @@
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,
@ -23,21 +23,12 @@ import { VIDEO_TRANSCODING_FPS } from '../initializers/constants'
// * 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}`
]
@ -49,6 +40,7 @@ const defaultX264LiveOptionsBuilder: EncoderOptionsBuilder = async ({ resolution
return {
outputOptions: [
`${buildStreamSuffix('-r:v', streamNum)} ${fps}`,
`${buildStreamSuffix('-b:v', streamNum)} ${targetBitrate}`,
`-maxrate ${targetBitrate}`,
`-bufsize ${targetBitrate * 2}`
@ -115,3 +107,21 @@ export {
}
// ---------------------------------------------------------------------------
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)
}