From 9252a33d115bba85adcfbc18ab3725924642871c Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 23 Nov 2020 16:23:52 +0100 Subject: Export encoders options in a dedicated struct --- server/initializers/checker-before-init.ts | 29 ++++++++++++++++++----------- server/initializers/constants.ts | 12 ++++++++++++ 2 files changed, 30 insertions(+), 11 deletions(-) (limited to 'server/initializers') diff --git a/server/initializers/checker-before-init.ts b/server/initializers/checker-before-init.ts index 93b71a242..4ffd6fad9 100644 --- a/server/initializers/checker-before-init.ts +++ b/server/initializers/checker-before-init.ts @@ -82,6 +82,8 @@ function checkMissedConfig () { async function checkFFmpeg (CONFIG: { TRANSCODING: { ENABLED: boolean } }) { if (CONFIG.TRANSCODING.ENABLED === false) return undefined + checkFFmpegEncoders() + const Ffmpeg = require('fluent-ffmpeg') const getAvailableCodecsPromise = promisify0(Ffmpeg.getAvailableCodecs) const codecs = await getAvailableCodecsPromise() @@ -100,25 +102,30 @@ async function checkFFmpeg (CONFIG: { TRANSCODING: { ENABLED: boolean } }) { return checkFFmpegEncoders() } -// Optional encoders, if present, can be used to improve transcoding -// Here we ask ffmpeg if it detects their presence on the system, so that we can later use them -let supportedOptionalEncoders: Map +// Detect supported encoders by ffmpeg +let supportedEncoders: Map async function checkFFmpegEncoders (): Promise> { - if (supportedOptionalEncoders !== undefined) { - return supportedOptionalEncoders + if (supportedEncoders !== undefined) { + return supportedEncoders } const Ffmpeg = require('fluent-ffmpeg') const getAvailableEncodersPromise = promisify0(Ffmpeg.getAvailableEncoders) - const encoders = await getAvailableEncodersPromise() - const optionalEncoders = [ 'libfdk_aac' ] - supportedOptionalEncoders = new Map() + const availableEncoders = await getAvailableEncodersPromise() + + const searchEncoders = [ + 'aac', + 'libfdk_aac', + 'libx264' + ] + + supportedEncoders = new Map() - for (const encoder of optionalEncoders) { - supportedOptionalEncoders.set(encoder, encoders[encoder] !== undefined) + for (const searchEncoder of searchEncoders) { + supportedEncoders.set(searchEncoder, availableEncoders[searchEncoder] !== undefined) } - return supportedOptionalEncoders + return supportedEncoders } function checkNodeVersion () { diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 5c6d06077..945185f62 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -336,6 +336,17 @@ const VIDEO_TRANSCODING_FPS: VideoTranscodingFPS = { KEEP_ORIGIN_FPS_RESOLUTION_MIN: 720 // We keep the original FPS on high resolutions (720 minimum) } +const VIDEO_TRANSCODING_ENCODERS = { + VIDEO: [ 'libx264' ], + + // Try the first one, if not available try the second one etc + AUDIO: [ + // we favor VBR, if a good AAC encoder is available + 'libfdk_aac', + 'aac' + ] +} + const DEFAULT_AUDIO_RESOLUTION = VideoResolution.H_480P const VIDEO_RATE_TYPES: { [ id: string ]: VideoRateType } = { @@ -804,6 +815,7 @@ export { ACTOR_FOLLOW_SCORE, PREVIEWS_SIZE, REMOTE_SCHEME, + VIDEO_TRANSCODING_ENCODERS, FOLLOW_STATES, DEFAULT_USER_THEME_NAME, SERVER_ACTOR_NAME, -- cgit v1.2.3