From 4ea659d569d596791bc6bf3f15d8ee9eea20b672 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 29 May 2024 08:56:53 +0200 Subject: [PATCH] Handle videos with FPS < 1 --- packages/ffmpeg/src/ffmpeg-images.ts | 2 +- .../transcoding/video-transcoding-fps.model.ts | 13 +++++++++++-- server/core/helpers/ffmpeg/framerate.ts | 12 +++++++----- server/core/initializers/constants.ts | 5 +++-- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/ffmpeg/src/ffmpeg-images.ts b/packages/ffmpeg/src/ffmpeg-images.ts index 52076de54..b34e22f5e 100644 --- a/packages/ffmpeg/src/ffmpeg-images.ts +++ b/packages/ffmpeg/src/ffmpeg-images.ts @@ -120,7 +120,7 @@ export class FFmpegImage { const filter = [ // Fix "t" variable with some videos - `setpts=N/round(FRAME_RATE)/TB`, + `setpts='N/FRAME_RATE/TB'`, // First frame or the time difference between the last and the current frame is enough for our sprite interval `select='isnan(prev_selected_t)+gte(t-prev_selected_t,${options.sprites.duration})'`, `scale=${sprites.size.width}:${sprites.size.height}`, diff --git a/packages/models/src/videos/transcoding/video-transcoding-fps.model.ts b/packages/models/src/videos/transcoding/video-transcoding-fps.model.ts index 9a330ac94..c0a44c5d1 100644 --- a/packages/models/src/videos/transcoding/video-transcoding-fps.model.ts +++ b/packages/models/src/videos/transcoding/video-transcoding-fps.model.ts @@ -1,9 +1,18 @@ export type VideoTranscodingFPS = { - MIN: number + // Refuse videos with FPS below this limit + HARD_MIN: number + // Cap FPS to this min value + SOFT_MIN: number + STANDARD: number[] HD_STANDARD: number[] + AUDIO_MERGE: number + AVERAGE: number - MAX: number + + // Cap FPS to this max value + SOFT_MAX: number + KEEP_ORIGIN_FPS_RESOLUTION_MIN: number } diff --git a/server/core/helpers/ffmpeg/framerate.ts b/server/core/helpers/ffmpeg/framerate.ts index 8aef6f021..7d06cd3b1 100644 --- a/server/core/helpers/ffmpeg/framerate.ts +++ b/server/core/helpers/ffmpeg/framerate.ts @@ -18,13 +18,15 @@ export function computeOutputFPS (options: { fps = getClosestFramerateStandard({ fps, type: 'STANDARD' }) } - // Hard FPS limits - if (fps > VIDEO_TRANSCODING_FPS.MAX) fps = getClosestFramerateStandard({ fps, type: 'HD_STANDARD' }) - - if (fps < VIDEO_TRANSCODING_FPS.MIN) { - throw new Error(`Cannot compute FPS because ${fps} is lower than our minimum value ${VIDEO_TRANSCODING_FPS.MIN}`) + if (fps < VIDEO_TRANSCODING_FPS.HARD_MIN) { + throw new Error(`Cannot compute FPS because ${fps} is lower than our minimum value ${VIDEO_TRANSCODING_FPS.HARD_MIN}`) } + // Cap min FPS + if (fps < VIDEO_TRANSCODING_FPS.SOFT_MIN) fps = VIDEO_TRANSCODING_FPS.SOFT_MIN + // Cap max FPS + if (fps > VIDEO_TRANSCODING_FPS.SOFT_MAX) fps = getClosestFramerateStandard({ fps, type: 'HD_STANDARD' }) + return fps } diff --git a/server/core/initializers/constants.ts b/server/core/initializers/constants.ts index a3a0b4951..4b6eecadc 100644 --- a/server/core/initializers/constants.ts +++ b/server/core/initializers/constants.ts @@ -513,12 +513,13 @@ const MAX_LOCAL_VIEWER_WATCH_SECTIONS = 100 let CONTACT_FORM_LIFETIME = 60000 * 60 // 1 hour const VIDEO_TRANSCODING_FPS: VideoTranscodingFPS = { - MIN: 1, + HARD_MIN: 0.1, + SOFT_MIN: 1, STANDARD: [ 24, 25, 30 ], HD_STANDARD: [ 50, 60 ], AUDIO_MERGE: 25, AVERAGE: 30, - MAX: 60, + SOFT_MAX: 60, KEEP_ORIGIN_FPS_RESOLUTION_MIN: 720 // We keep the original FPS on high resolutions (720 minimum) }