X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fhelpers%2Fffprobe-utils.ts;h=e15628e2a7ff428251eab933e803e8cc1b800717;hb=854f533c12bd2b88c70f9d5aeab770059e9a6861;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..e15628e2a 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,19 +194,19 @@ 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 } -function computeResolutionsToTranscode (videoFileResolution: number, type: 'vod' | 'live') { +function computeLowerResolutionsToTranscode (videoFileResolution: number, type: 'vod' | 'live') { const configResolutions = type === 'vod' ? CONFIG.TRANSCODING.RESOLUTIONS : CONFIG.LIVE.TRANSCODING.RESOLUTIONS @@ -214,12 +214,13 @@ function computeResolutionsToTranscode (videoFileResolution: number, type: 'vod' const resolutionsEnabled: number[] = [] // Put in the order we want to proceed jobs - const resolutions = [ + const resolutions: VideoResolution[] = [ VideoResolution.H_NOVIDEO, VideoResolution.H_480P, VideoResolution.H_360P, VideoResolution.H_720P, VideoResolution.H_240P, + VideoResolution.H_144P, VideoResolution.H_1080P, VideoResolution.H_1440P, VideoResolution.H_4K @@ -243,7 +244,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 +263,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 +303,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 } @@ -323,7 +327,7 @@ export { getVideoFileFPS, ffprobePromise, getClosestFramerateStandard, - computeResolutionsToTranscode, + computeLowerResolutionsToTranscode, getVideoFileBitrate, canDoQuickTranscode, canDoQuickVideoTranscode,