* Set bitrate limits for transcoding (fixes #638) * added optimization script and test, changed stuff * fix test, improve docs * re-add optimize-old-videos script * added documentation * Don't optimize videos without valid UUID, or redundancy videos * move getUUIDFromFilename * fix tests? * update torrent and file size, some more fixes/improvements * use higher bitrate for high fps video, adjust bitrates * add test video * don't throw error if resolution is undefined * generate test fixture on the fly * use random noise video for bitrate test, add promise * shorten test video to avoid timeout * use existing function to optimize video * various fixes * increase test timeout * limit test fixture size, add link * test fixes * add await * more test fixes, add -b:v parameter * replace ffmpeg wiki link * fix ffmpeg params * fix unit test * add test fixture to .gitgnore * add video transcoding fps model * add missing file
This commit is contained in:
parent
2cae5f1307
commit
edb4ffc7e0
16 changed files with 221 additions and 26 deletions
|
@ -1,6 +1,6 @@
|
|||
import * as ffmpeg from 'fluent-ffmpeg'
|
||||
import { join } from 'path'
|
||||
import { VideoResolution } from '../../shared/models/videos'
|
||||
import { VideoResolution, getTargetBitrate } from '../../shared/models/videos'
|
||||
import { CONFIG, FFMPEG_NICE, VIDEO_TRANSCODING_FPS } from '../initializers'
|
||||
import { processImage } from './image-utils'
|
||||
import { logger } from './logger'
|
||||
|
@ -55,6 +55,16 @@ async function getVideoFileFPS (path: string) {
|
|||
return 0
|
||||
}
|
||||
|
||||
async function getVideoFileBitrate (path: string) {
|
||||
return new Promise<number>((res, rej) => {
|
||||
ffmpeg.ffprobe(path, (err, metadata) => {
|
||||
if (err) return rej(err)
|
||||
|
||||
return res(metadata.format.bit_rate)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function getDurationFromVideoFile (path: string) {
|
||||
return new Promise<number>((res, rej) => {
|
||||
ffmpeg.ffprobe(path, (err, metadata) => {
|
||||
|
@ -138,6 +148,12 @@ function transcode (options: TranscodeOptions) {
|
|||
command = command.withFPS(fps)
|
||||
}
|
||||
|
||||
// Constrained Encoding (VBV)
|
||||
// https://slhck.info/video/2017/03/01/rate-control.html
|
||||
// https://trac.ffmpeg.org/wiki/Limiting%20the%20output%20bitrate
|
||||
const targetBitrate = getTargetBitrate(options.resolution, fps, VIDEO_TRANSCODING_FPS)
|
||||
command.outputOptions([`-b:v ${ targetBitrate }`, `-maxrate ${ targetBitrate }`, `-bufsize ${ targetBitrate * 2 }`])
|
||||
|
||||
command
|
||||
.on('error', (err, stdout, stderr) => {
|
||||
logger.error('Error in transcoding job.', { stdout, stderr })
|
||||
|
@ -157,7 +173,8 @@ export {
|
|||
transcode,
|
||||
getVideoFileFPS,
|
||||
computeResolutionsToTranscode,
|
||||
audio
|
||||
audio,
|
||||
getVideoFileBitrate
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue