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

Improve target bitrate calculation

This commit is contained in:
Chocobozzz 2021-08-06 13:35:25 +02:00
parent c826f34a45
commit 679c12e69c
No known key found for this signature in database
GPG key ID: 583A612D890159BE
24 changed files with 263 additions and 204 deletions

View file

@ -1,23 +1,24 @@
import { logger } from '@server/helpers/logger'
import { AvailableEncoders, EncoderOptionsBuilder, getTargetBitrate, VideoResolution } from '../../../shared/models/videos'
import { getAverageBitrate } from '@shared/core-utils'
import { AvailableEncoders, EncoderOptionsBuilder, EncoderOptionsBuilderParams } 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 = async (options: EncoderOptionsBuilderParams) => {
const { fps, inputRatio, inputBitrate } = options
if (!fps) return { outputOptions: [ ] }
const defaultX264VODOptionsBuilder: EncoderOptionsBuilder = async ({ inputBitrate, resolution, fps }) => {
const targetBitrate = buildTargetBitrate({ inputBitrate, resolution, fps })
if (!targetBitrate) return { outputOptions: [ ] }
const targetBitrate = capBitrate(inputBitrate, getAverageBitrate({ ...options, fps, ratio: inputRatio }))
return {
outputOptions: [
@ -29,8 +30,10 @@ const defaultX264VODOptionsBuilder: EncoderOptionsBuilder = async ({ inputBitrat
}
}
const defaultX264LiveOptionsBuilder: EncoderOptionsBuilder = async ({ resolution, fps, inputBitrate, streamNum }) => {
const targetBitrate = buildTargetBitrate({ inputBitrate, resolution, fps })
const defaultX264LiveOptionsBuilder: EncoderOptionsBuilder = async (options: EncoderOptionsBuilderParams) => {
const { streamNum, fps, inputBitrate, inputRatio } = options
const targetBitrate = capBitrate(inputBitrate, getAverageBitrate({ ...options, fps, ratio: inputRatio }))
return {
outputOptions: [
@ -231,14 +234,7 @@ export {
// ---------------------------------------------------------------------------
function buildTargetBitrate (options: {
inputBitrate: number
resolution: VideoResolution
fps: number
}) {
const { inputBitrate, resolution, fps } = options
const targetBitrate = getTargetBitrate(resolution, fps, VIDEO_TRANSCODING_FPS)
function capBitrate (inputBitrate: number, targetBitrate: number) {
if (!inputBitrate) return targetBitrate
return Math.min(targetBitrate, inputBitrate)