return new Promise<void>(async (res, rej) => {
let fps = await getVideoFileFPS(options.inputPath)
// On small/medium resolutions, limit FPS
- if (options.resolution !== undefined &&
- options.resolution < VIDEO_TRANSCODING_FPS.KEEP_ORIGIN_FPS_RESOLUTION_MIN &&
- fps > VIDEO_TRANSCODING_FPS.AVERAGE) {
- fps = VIDEO_TRANSCODING_FPS.AVERAGE
- }
+ // if (
+ // options.resolution !== undefined &&
+ // options.resolution < VIDEO_TRANSCODING_FPS.KEEP_ORIGIN_FPS_RESOLUTION_MIN &&
+ // fps > VIDEO_TRANSCODING_FPS.AVERAGE
+ // ) {
+ // fps = VIDEO_TRANSCODING_FPS.AVERAGE
+ // }
let command = ffmpeg(options.inputPath, { niceness: FFMPEG_NICE.TRANSCODING })
.output(options.outputPath)
// https://slhck.info/video/2017/03/01/rate-control.html
// https://trac.ffmpeg.org/wiki/Limiting%20the%20output%20bitrate
const targetBitrate = getTargetBitrate(resolution, fps, VIDEO_TRANSCODING_FPS)
- localFfmpeg.outputOptions([`-maxrate ${ targetBitrate }`, `-bufsize ${ targetBitrate * 2 }`])
+ localFfmpeg = localFfmpeg.outputOptions([`-maxrate ${ targetBitrate }`, `-bufsize ${ targetBitrate * 2 }`])
// Keyframe interval of 2 seconds for faster seeking and resolution switching.
// https://streaminglearningcenter.com/blogs/whats-the-right-keyframe-interval.html
// https://superuser.com/a/908325
- localFfmpeg.outputOption(`-g ${ fps * 2 }`)
+ localFfmpeg = localFfmpeg.outputOption(`-g ${ fps * 2 }`)
return localFfmpeg
}
* getBaseBitrate() * 1.4. All other values are calculated linearly
* between these two points.
*/
-export function getTargetBitrate (resolution: VideoResolution, fps: number,
- fpsTranscodingConstants: VideoTranscodingFPS) {
+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:
/**
* The maximum bitrate we expect to see on a transcoded video in bytes per second.
*/
-export function getMaxBitrate (resolution: VideoResolution, fps: number,
- fpsTranscodingConstants: VideoTranscodingFPS) {
+export function getMaxBitrate (resolution: VideoResolution, fps: number, fpsTranscodingConstants: VideoTranscodingFPS) {
return getTargetBitrate(resolution, fps, fpsTranscodingConstants) * 2
}