From 84cae54e7a2595bea0c3ea106a4d111fd11a4ec6 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 5 Aug 2022 10:36:19 +0200 Subject: Add option to not transcode original resolution --- server/helpers/ffmpeg/ffmpeg-vod.ts | 12 +++++++----- server/helpers/ffmpeg/ffprobe-utils.ts | 26 ++++++++++++++++++-------- 2 files changed, 25 insertions(+), 13 deletions(-) (limited to 'server/helpers') diff --git a/server/helpers/ffmpeg/ffmpeg-vod.ts b/server/helpers/ffmpeg/ffmpeg-vod.ts index c3622ceb1..f84157e0f 100644 --- a/server/helpers/ffmpeg/ffmpeg-vod.ts +++ b/server/helpers/ffmpeg/ffmpeg-vod.ts @@ -7,7 +7,7 @@ import { AvailableEncoders, VideoResolution } from '@shared/models' import { logger, loggerTagsFactory } from '../logger' import { getFFmpeg, runCommand } from './ffmpeg-commons' import { presetCopy, presetOnlyAudio, presetVOD } from './ffmpeg-presets' -import { computeFPS, getVideoStreamFPS } from './ffprobe-utils' +import { computeFPS, ffprobePromise, getVideoStreamDimensionsInfo, getVideoStreamFPS } from './ffprobe-utils' import { VIDEO_TRANSCODING_FPS } from '@server/initializers/constants' const lTags = loggerTagsFactory('ffmpeg') @@ -27,8 +27,6 @@ interface BaseTranscodeVODOptions { resolution: number - isPortraitMode?: boolean - job?: Job } @@ -115,13 +113,17 @@ export { // --------------------------------------------------------------------------- async function buildVODCommand (command: FfmpegCommand, options: TranscodeVODOptions) { - let fps = await getVideoStreamFPS(options.inputPath) + const probe = await ffprobePromise(options.inputPath) + + let fps = await getVideoStreamFPS(options.inputPath, probe) fps = computeFPS(fps, options.resolution) let scaleFilterValue: string if (options.resolution !== undefined) { - scaleFilterValue = options.isPortraitMode === true + const videoStreamInfo = await getVideoStreamDimensionsInfo(options.inputPath, probe) + + scaleFilterValue = videoStreamInfo?.isPortraitMode === true ? `w=${options.resolution}:h=-2` : `w=-2:h=${options.resolution}` } diff --git a/server/helpers/ffmpeg/ffprobe-utils.ts b/server/helpers/ffmpeg/ffprobe-utils.ts index 9529162eb..7bcd27665 100644 --- a/server/helpers/ffmpeg/ffprobe-utils.ts +++ b/server/helpers/ffmpeg/ffprobe-utils.ts @@ -90,15 +90,21 @@ async function getAudioStreamCodec (path: string, existingProbe?: FfprobeData) { // Resolutions // --------------------------------------------------------------------------- -function computeLowerResolutionsToTranscode (videoFileResolution: number, type: 'vod' | 'live') { +function computeResolutionsToTranscode (options: { + inputResolution: number + type: 'vod' | 'live' + includeInputResolution: boolean +}) { + const { inputResolution, type, includeInputResolution } = options + const configResolutions = type === 'vod' ? CONFIG.TRANSCODING.RESOLUTIONS : CONFIG.LIVE.TRANSCODING.RESOLUTIONS - const resolutionsEnabled: number[] = [] + const resolutionsEnabled = new Set() // Put in the order we want to proceed jobs - const resolutions: VideoResolution[] = [ + const availableResolutions: VideoResolution[] = [ VideoResolution.H_NOVIDEO, VideoResolution.H_480P, VideoResolution.H_360P, @@ -110,13 +116,17 @@ function computeLowerResolutionsToTranscode (videoFileResolution: number, type: VideoResolution.H_4K ] - for (const resolution of resolutions) { - if (configResolutions[resolution + 'p'] === true && videoFileResolution > resolution) { - resolutionsEnabled.push(resolution) + for (const resolution of availableResolutions) { + if (configResolutions[resolution + 'p'] === true && inputResolution > resolution) { + resolutionsEnabled.add(resolution) } } - return resolutionsEnabled + if (includeInputResolution) { + resolutionsEnabled.add(inputResolution) + } + + return Array.from(resolutionsEnabled) } // --------------------------------------------------------------------------- @@ -224,7 +234,7 @@ export { computeFPS, getClosestFramerateStandard, - computeLowerResolutionsToTranscode, + computeResolutionsToTranscode, canDoQuickTranscode, canDoQuickVideoTranscode, -- cgit v1.2.3