From 73c695919c6569bfb667c36fc5a6b9b862130a0d Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 26 Feb 2018 10:48:53 +0100 Subject: Add 30 fps limit in transcoding --- server/helpers/ffmpeg-utils.ts | 53 +++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 11 deletions(-) (limited to 'server/helpers/ffmpeg-utils.ts') diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts index c2581f460..ad6f2f867 100644 --- a/server/helpers/ffmpeg-utils.ts +++ b/server/helpers/ffmpeg-utils.ts @@ -1,16 +1,27 @@ import * as ffmpeg from 'fluent-ffmpeg' import { VideoResolution } from '../../shared/models/videos' -import { CONFIG } from '../initializers' +import { CONFIG, MAX_VIDEO_TRANSCODING_FPS } from '../initializers' -function getVideoFileHeight (path: string) { - return new Promise((res, rej) => { - ffmpeg.ffprobe(path, (err, metadata) => { - if (err) return rej(err) +async function getVideoFileHeight (path: string) { + const videoStream = await getVideoFileStream(path) + return videoStream.height +} - const videoStream = metadata.streams.find(s => s.codec_type === 'video') - return res(videoStream.height) - }) - }) +async function getVideoFileFPS (path: string) { + const videoStream = await getVideoFileStream(path) + + for (const key of [ 'r_frame_rate' , 'avg_frame_rate' ]) { + const valuesText: string = videoStream[key] + if (!valuesText) continue + + const [ frames, seconds ] = valuesText.split('/') + if (!frames || !seconds) continue + + const result = parseInt(frames, 10) / parseInt(seconds, 10) + if (result > 0) return result + } + + return 0 } function getDurationFromVideoFile (path: string) { @@ -49,7 +60,9 @@ type TranscodeOptions = { } function transcode (options: TranscodeOptions) { - return new Promise((res, rej) => { + return new Promise(async (res, rej) => { + const fps = await getVideoFileFPS(options.inputPath) + let command = ffmpeg(options.inputPath) .output(options.outputPath) .videoCodec('libx264') @@ -57,6 +70,8 @@ function transcode (options: TranscodeOptions) { .outputOption('-movflags faststart') // .outputOption('-crf 18') + if (fps > MAX_VIDEO_TRANSCODING_FPS) command = command.withFPS(MAX_VIDEO_TRANSCODING_FPS) + if (options.resolution !== undefined) { const size = `?x${options.resolution}` // '?x720' for example command = command.size(size) @@ -74,5 +89,21 @@ export { getVideoFileHeight, getDurationFromVideoFile, generateImageFromVideoFile, - transcode + transcode, + getVideoFileFPS +} + +// --------------------------------------------------------------------------- + +function getVideoFileStream (path: string) { + return new Promise((res, rej) => { + ffmpeg.ffprobe(path, (err, metadata) => { + if (err) return rej(err) + + const videoStream = metadata.streams.find(s => s.codec_type === 'video') + if (!videoStream) throw new Error('Cannot find video stream of ' + path) + + return res(videoStream) + }) + }) } -- cgit v1.2.3