1
0
Fork 0

Scale bitrate linearly with FPS

This commit is contained in:
Felix Ableitner 2018-10-09 17:46:26 -05:00 committed by Chocobozzz
parent 7cdc3ab63b
commit 7f196c9320

View file

@ -9,13 +9,13 @@ export enum VideoResolution {
} }
/** /**
* Bitrate targets for different resolutions and frame rates, in bytes per second. * Bitrate targets for different resolutions, at VideoTranscodingFPS.AVERAGE.
*
* Sources for individual quality levels: * Sources for individual quality levels:
* Google Live Encoder: https://support.google.com/youtube/answer/2853702?hl=en * Google Live Encoder: https://support.google.com/youtube/answer/2853702?hl=en
* YouTube Video Info (tested with random music video): https://www.h3xed.com/blogmedia/youtube-info.php * YouTube Video Info (tested with random music video): https://www.h3xed.com/blogmedia/youtube-info.php
*/ */
export function getTargetBitrate (resolution: VideoResolution, fps: number, export function getBaseBitrate (resolution: VideoResolution) {
fpsTranscodingConstants: VideoTranscodingFPS) {
switch (resolution) { switch (resolution) {
case VideoResolution.H_240P: case VideoResolution.H_240P:
// quality according to Google Live Encoder: 300 - 700 Kbps // quality according to Google Live Encoder: 300 - 700 Kbps
@ -30,29 +30,36 @@ export function getTargetBitrate (resolution: VideoResolution, fps: number,
// Quality according to YouTube Video Info: 879 Kbps // Quality according to YouTube Video Info: 879 Kbps
return 900 * 1000 return 900 * 1000
case VideoResolution.H_720P: case VideoResolution.H_720P:
if (fps === fpsTranscodingConstants.MAX) {
// quality according to Google Live Encoder: 2,250 - 6,000 Kbps
// Quality according to YouTube Video Info: 2634 Kbps
return 2600 * 1000
}
// quality according to Google Live Encoder: 1,500 - 4,000 Kbps // quality according to Google Live Encoder: 1,500 - 4,000 Kbps
// Quality according to YouTube Video Info: 1752 Kbps // Quality according to YouTube Video Info: 1752 Kbps
return 1750 * 1000 return 1750 * 1000
case VideoResolution.H_1080P: // fallthrough case VideoResolution.H_1080P: // fallthrough
default: default:
if (fps === fpsTranscodingConstants.MAX) {
// quality according to Google Live Encoder: 3000 - 6000 Kbps
// Quality according to YouTube Video Info: 4387 Kbps
return 4400 * 1000
}
// quality according to Google Live Encoder: 3000 - 6000 Kbps // quality according to Google Live Encoder: 3000 - 6000 Kbps
// Quality according to YouTube Video Info: 3277 Kbps // Quality according to YouTube Video Info: 3277 Kbps
return 3300 * 1000 return 3300 * 1000
} }
} }
/**
* Calculate the target bitrate based on video resolution and FPS.
*/
export function getTargetBitrate (resolution: VideoResolution, fps: number,
fpsTranscodingConstants: VideoTranscodingFPS) {
const baseBitrate = getBaseBitrate(resolution)
// The maximum bitrate, used when fps === VideoTranscodingFPS.MAX
// Based on numbers from Youtube, 60 fps bitrate divided by 30 fps bitrate:
// 2600 / 1750 = 1.48571428571
// 4400 / 3300 = 1.33333333333
const maxBitrate = baseBitrate * 1.4
const maxBitrateDifference = maxBitrate - baseBitrate
const maxFpsDifference = fpsTranscodingConstants.MAX - fpsTranscodingConstants.AVERAGE
// For 1080p video with default settings, this results in the following formula:
// 3300 + (x - 30) * (1320/30)
// Example outputs: 1080p30: 3300 kbps, 1080p60: 4620 kbps, 720p30: 1750, 720p60: 2450
return baseBitrate + (fps - fpsTranscodingConstants.AVERAGE) * (maxBitrateDifference / maxFpsDifference)
}
/** /**
* The maximum bitrate we expect to see on a transcoded video in bytes per second. * The maximum bitrate we expect to see on a transcoded video in bytes per second.
*/ */