From 33ff70baa64c6315856066682595878a27b7ed8c Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 24 Nov 2020 16:24:50 +0100 Subject: [PATCH] Fix audio encoding params --- server/helpers/ffprobe-utils.ts | 56 +++++++++++---------- server/lib/live-manager.ts | 3 +- server/tests/api/videos/multiple-servers.ts | 8 +-- server/tests/api/videos/single-server.ts | 2 + 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/server/helpers/ffprobe-utils.ts b/server/helpers/ffprobe-utils.ts index 5545ddbbf..d03ab91ac 100644 --- a/server/helpers/ffprobe-utils.ts +++ b/server/helpers/ffprobe-utils.ts @@ -37,38 +37,37 @@ async function getAudioStream (videoPath: string, existingProbe?: ffmpeg.Ffprobe } function getMaxAudioBitrate (type: 'aac' | 'mp3' | string, bitrate: number) { - const baseKbitrate = 384 - const toBits = (kbits: number) => kbits * 8000 + const maxKBitrate = 384 + const kToBits = (kbits: number) => kbits * 1000 + + // If we did not manage to get the bitrate, use an average value + if (!bitrate) return 256 if (type === 'aac') { switch (true) { - case bitrate > toBits(baseKbitrate): - return baseKbitrate + case bitrate > kToBits(maxKBitrate): + return maxKBitrate default: return -1 // we interpret it as a signal to copy the audio stream as is } } - if (type === 'mp3') { - /* - a 192kbit/sec mp3 doesn't hold as much information as a 192kbit/sec aac. - That's why, when using aac, we can go to lower kbit/sec. The equivalences - made here are not made to be accurate, especially with good mp3 encoders. - */ - switch (true) { - case bitrate <= toBits(192): - return 128 + /* + a 192kbit/sec mp3 doesn't hold as much information as a 192kbit/sec aac. + That's why, when using aac, we can go to lower kbit/sec. The equivalences + made here are not made to be accurate, especially with good mp3 encoders. + */ + switch (true) { + case bitrate <= kToBits(192): + return 128 - case bitrate <= toBits(384): - return 256 + case bitrate <= kToBits(384): + return 256 - default: - return baseKbitrate - } + default: + return maxKBitrate } - - return undefined } async function getVideoStreamSize (path: string, existingProbe?: ffmpeg.FfprobeData) { @@ -208,6 +207,9 @@ async function canDoQuickVideoTranscode (path: string, probe?: ffmpeg.FfprobeDat const bitRate = await getVideoFileBitrate(path, probe) const resolution = await getVideoFileResolution(path, probe) + // If ffprobe did not manage to guess the bitrate + if (!bitRate) return false + // check video params if (videoStream == null) return false if (videoStream['codec_name'] !== 'h264') return false @@ -221,15 +223,15 @@ async function canDoQuickVideoTranscode (path: string, probe?: ffmpeg.FfprobeDat async function canDoQuickAudioTranscode (path: string, probe?: ffmpeg.FfprobeData): Promise { const parsedAudio = await getAudioStream(path, probe) - // check audio params (if audio stream exists) - if (parsedAudio.audioStream) { - if (parsedAudio.audioStream['codec_name'] !== 'aac') return false + if (!parsedAudio.audioStream) return true - const audioBitrate = parsedAudio.bitrate + if (parsedAudio.audioStream['codec_name'] !== 'aac') return false - const maxAudioBitrate = getMaxAudioBitrate('aac', audioBitrate) - if (maxAudioBitrate !== -1 && audioBitrate > maxAudioBitrate) return false - } + const audioBitrate = parsedAudio.bitrate + if (!audioBitrate) return false + + const maxAudioBitrate = getMaxAudioBitrate('aac', audioBitrate) + if (maxAudioBitrate !== -1 && audioBitrate > maxAudioBitrate) return false return true } diff --git a/server/lib/live-manager.ts b/server/lib/live-manager.ts index ee0e4de37..d63e79dfc 100644 --- a/server/lib/live-manager.ts +++ b/server/lib/live-manager.ts @@ -268,8 +268,7 @@ class LiveManager { ? await getLiveTranscodingCommand({ rtmpUrl, outPath, - resolutions: - allResolutions, + resolutions: allResolutions, fps, deleteSegments, availableEncoders, diff --git a/server/tests/api/videos/multiple-servers.ts b/server/tests/api/videos/multiple-servers.ts index a62783639..fdd5e33f3 100644 --- a/server/tests/api/videos/multiple-servers.ts +++ b/server/tests/api/videos/multiple-servers.ts @@ -216,19 +216,19 @@ describe('Test multiple servers', function () { files: [ { resolution: 240, - size: 189000 + size: 270000 }, { resolution: 360, - size: 278000 + size: 359000 }, { resolution: 480, - size: 384000 + size: 465000 }, { resolution: 720, - size: 706000 + size: 788000 } ], thumbnailfile: 'thumbnail', diff --git a/server/tests/api/videos/single-server.ts b/server/tests/api/videos/single-server.ts index 0ae405950..b74bc3e80 100644 --- a/server/tests/api/videos/single-server.ts +++ b/server/tests/api/videos/single-server.ts @@ -157,6 +157,8 @@ describe('Test a single server', function () { }) it('Should upload the video', async function () { + this.timeout(10000) + const videoAttributes = { name: 'my super name', category: 2,