import { VIDEO_TRANSCODING_FPS } from '../initializers/constants'
import { logger } from './logger'
+/**
+ *
+ * Helpers to run ffprobe and extract data from the JSON output
+ *
+ */
+
function ffprobePromise (path: string) {
return new Promise<ffmpeg.FfprobeData>((res, rej) => {
ffmpeg.ffprobe(path, (err, data) => {
async function getDurationFromVideoFile (path: string, existingProbe?: ffmpeg.FfprobeData) {
const metadata = await getMetadataFromFile(path, existingProbe)
- return Math.floor(metadata.format.duration)
+ return Math.round(metadata.format.duration)
}
async function getVideoStreamFromFile (path: string, existingProbe?: ffmpeg.FfprobeData) {
VideoResolution.H_720P,
VideoResolution.H_240P,
VideoResolution.H_1080P,
+ VideoResolution.H_1440P,
VideoResolution.H_4K
]
.sort((a, b) => fps % a - fps % b)[0]
}
+function computeFPS (fpsArg: number, resolution: VideoResolution) {
+ let fps = fpsArg
+
+ if (
+ // On small/medium resolutions, limit FPS
+ resolution !== undefined &&
+ resolution < VIDEO_TRANSCODING_FPS.KEEP_ORIGIN_FPS_RESOLUTION_MIN &&
+ fps > VIDEO_TRANSCODING_FPS.AVERAGE
+ ) {
+ // Get closest standard framerate by modulo: downsampling has to be done to a divisor of the nominal fps value
+ fps = getClosestFramerateStandard(fps, 'STANDARD')
+ }
+
+ // 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
+
+ return fps
+}
+
// ---------------------------------------------------------------------------
export {
getVideoStreamFromFile,
getDurationFromVideoFile,
getAudioStream,
+ computeFPS,
getVideoFileFPS,
ffprobePromise,
getClosestFramerateStandard,