X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fhelpers%2Fffprobe-utils.ts;h=767f37f9ca3141fbfd539321e1605c42908c1ba0;hb=bacb544dbb548955d3f47365902b104d787a51a3;hp=e58444b07296dd16453abfbc7ad27cd12bec488a;hpb=679c12e69c9f3a2d003ee3abe8b8da49f25b2bd3;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/helpers/ffprobe-utils.ts b/server/helpers/ffprobe-utils.ts index e58444b07..767f37f9c 100644 --- a/server/helpers/ffprobe-utils.ts +++ b/server/helpers/ffprobe-utils.ts @@ -1,4 +1,4 @@ -import * as ffmpeg from 'fluent-ffmpeg' +import { ffprobe, FfprobeData } from 'fluent-ffmpeg' import { getMaxBitrate } from '@shared/core-utils' import { VideoFileMetadata, VideoResolution, VideoTranscodingFPS } from '../../shared/models/videos' import { CONFIG } from '../initializers/config' @@ -12,8 +12,8 @@ import { logger } from './logger' */ function ffprobePromise (path: string) { - return new Promise((res, rej) => { - ffmpeg.ffprobe(path, (err, data) => { + return new Promise((res, rej) => { + ffprobe(path, (err, data) => { if (err) return rej(err) return res(data) @@ -21,7 +21,7 @@ function ffprobePromise (path: string) { }) } -async function getAudioStream (videoPath: string, existingProbe?: ffmpeg.FfprobeData) { +async function getAudioStream (videoPath: string, existingProbe?: FfprobeData) { // without position, ffprobe considers the last input only // we make it consider the first input only // if you pass a file path to pos, then ffprobe acts on that file directly @@ -76,7 +76,7 @@ function getMaxAudioBitrate (type: 'aac' | 'mp3' | string, bitrate: number) { } } -async function getVideoStreamSize (path: string, existingProbe?: ffmpeg.FfprobeData): Promise<{ width: number, height: number }> { +async function getVideoStreamSize (path: string, existingProbe?: FfprobeData): Promise<{ width: number, height: number }> { const videoStream = await getVideoStreamFromFile(path, existingProbe) return videoStream === null @@ -127,7 +127,7 @@ async function getVideoStreamCodec (path: string) { return `${videoCodec}.${baseProfile}${level}` } -async function getAudioStreamCodec (path: string, existingProbe?: ffmpeg.FfprobeData) { +async function getAudioStreamCodec (path: string, existingProbe?: FfprobeData) { const { audioStream } = await getAudioStream(path, existingProbe) if (!audioStream) return '' @@ -143,7 +143,7 @@ async function getAudioStreamCodec (path: string, existingProbe?: ffmpeg.Ffprobe return 'mp4a.40.2' // Fallback } -async function getVideoFileResolution (path: string, existingProbe?: ffmpeg.FfprobeData) { +async function getVideoFileResolution (path: string, existingProbe?: FfprobeData) { const size = await getVideoStreamSize(path, existingProbe) return { @@ -155,7 +155,7 @@ async function getVideoFileResolution (path: string, existingProbe?: ffmpeg.Ffpr } } -async function getVideoFileFPS (path: string, existingProbe?: ffmpeg.FfprobeData) { +async function getVideoFileFPS (path: string, existingProbe?: FfprobeData) { const videoStream = await getVideoStreamFromFile(path, existingProbe) if (videoStream === null) return 0 @@ -173,13 +173,13 @@ async function getVideoFileFPS (path: string, existingProbe?: ffmpeg.FfprobeData return 0 } -async function getMetadataFromFile (path: string, existingProbe?: ffmpeg.FfprobeData) { +async function getMetadataFromFile (path: string, existingProbe?: FfprobeData) { const metadata = existingProbe || await ffprobePromise(path) return new VideoFileMetadata(metadata) } -async function getVideoFileBitrate (path: string, existingProbe?: ffmpeg.FfprobeData): Promise { +async function getVideoFileBitrate (path: string, existingProbe?: FfprobeData): Promise { const metadata = await getMetadataFromFile(path, existingProbe) let bitrate = metadata.format.bit_rate as number @@ -194,13 +194,13 @@ async function getVideoFileBitrate (path: string, existingProbe?: ffmpeg.Ffprobe return undefined } -async function getDurationFromVideoFile (path: string, existingProbe?: ffmpeg.FfprobeData) { +async function getDurationFromVideoFile (path: string, existingProbe?: FfprobeData) { const metadata = await getMetadataFromFile(path, existingProbe) return Math.round(metadata.format.duration) } -async function getVideoStreamFromFile (path: string, existingProbe?: ffmpeg.FfprobeData) { +async function getVideoStreamFromFile (path: string, existingProbe?: FfprobeData) { const metadata = await getMetadataFromFile(path, existingProbe) return metadata.streams.find(s => s.codec_type === 'video') || null @@ -243,7 +243,7 @@ async function canDoQuickTranscode (path: string): Promise { await canDoQuickAudioTranscode(path, probe) } -async function canDoQuickVideoTranscode (path: string, probe?: ffmpeg.FfprobeData): Promise { +async function canDoQuickVideoTranscode (path: string, probe?: FfprobeData): Promise { const videoStream = await getVideoStreamFromFile(path, probe) const fps = await getVideoFileFPS(path, probe) const bitRate = await getVideoFileBitrate(path, probe) @@ -262,7 +262,7 @@ async function canDoQuickVideoTranscode (path: string, probe?: ffmpeg.FfprobeDat return true } -async function canDoQuickAudioTranscode (path: string, probe?: ffmpeg.FfprobeData): Promise { +async function canDoQuickAudioTranscode (path: string, probe?: FfprobeData): Promise { const parsedAudio = await getAudioStream(path, probe) if (!parsedAudio.audioStream) return true @@ -302,7 +302,10 @@ function computeFPS (fpsArg: number, resolution: VideoResolution) { // Hard FPS limits if (fps > VIDEO_TRANSCODING_FPS.MAX) fps = getClosestFramerateStandard(fps, 'HD_STANDARD') - else if (fps < VIDEO_TRANSCODING_FPS.MIN) fps = VIDEO_TRANSCODING_FPS.MIN + + if (fps < VIDEO_TRANSCODING_FPS.MIN) { + throw new Error(`Cannot compute FPS because ${fps} is lower than our minimum value ${VIDEO_TRANSCODING_FPS.MIN}`) + } return fps }