Fix audio encoding params
This commit is contained in:
parent
ca5c612bfd
commit
33ff70baa6
|
@ -37,40 +37,39 @@ async function getAudioStream (videoPath: string, existingProbe?: ffmpeg.Ffprobe
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMaxAudioBitrate (type: 'aac' | 'mp3' | string, bitrate: number) {
|
function getMaxAudioBitrate (type: 'aac' | 'mp3' | string, bitrate: number) {
|
||||||
const baseKbitrate = 384
|
const maxKBitrate = 384
|
||||||
const toBits = (kbits: number) => kbits * 8000
|
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') {
|
if (type === 'aac') {
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case bitrate > toBits(baseKbitrate):
|
case bitrate > kToBits(maxKBitrate):
|
||||||
return baseKbitrate
|
return maxKBitrate
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -1 // we interpret it as a signal to copy the audio stream as is
|
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.
|
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
|
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.
|
made here are not made to be accurate, especially with good mp3 encoders.
|
||||||
*/
|
*/
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case bitrate <= toBits(192):
|
case bitrate <= kToBits(192):
|
||||||
return 128
|
return 128
|
||||||
|
|
||||||
case bitrate <= toBits(384):
|
case bitrate <= kToBits(384):
|
||||||
return 256
|
return 256
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return baseKbitrate
|
return maxKBitrate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getVideoStreamSize (path: string, existingProbe?: ffmpeg.FfprobeData) {
|
async function getVideoStreamSize (path: string, existingProbe?: ffmpeg.FfprobeData) {
|
||||||
const videoStream = await getVideoStreamFromFile(path, existingProbe)
|
const videoStream = await getVideoStreamFromFile(path, existingProbe)
|
||||||
|
|
||||||
|
@ -208,6 +207,9 @@ async function canDoQuickVideoTranscode (path: string, probe?: ffmpeg.FfprobeDat
|
||||||
const bitRate = await getVideoFileBitrate(path, probe)
|
const bitRate = await getVideoFileBitrate(path, probe)
|
||||||
const resolution = await getVideoFileResolution(path, probe)
|
const resolution = await getVideoFileResolution(path, probe)
|
||||||
|
|
||||||
|
// If ffprobe did not manage to guess the bitrate
|
||||||
|
if (!bitRate) return false
|
||||||
|
|
||||||
// check video params
|
// check video params
|
||||||
if (videoStream == null) return false
|
if (videoStream == null) return false
|
||||||
if (videoStream['codec_name'] !== 'h264') 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<boolean> {
|
async function canDoQuickAudioTranscode (path: string, probe?: ffmpeg.FfprobeData): Promise<boolean> {
|
||||||
const parsedAudio = await getAudioStream(path, probe)
|
const parsedAudio = await getAudioStream(path, probe)
|
||||||
|
|
||||||
// check audio params (if audio stream exists)
|
if (!parsedAudio.audioStream) return true
|
||||||
if (parsedAudio.audioStream) {
|
|
||||||
if (parsedAudio.audioStream['codec_name'] !== 'aac') return false
|
if (parsedAudio.audioStream['codec_name'] !== 'aac') return false
|
||||||
|
|
||||||
const audioBitrate = parsedAudio.bitrate
|
const audioBitrate = parsedAudio.bitrate
|
||||||
|
if (!audioBitrate) return false
|
||||||
|
|
||||||
const maxAudioBitrate = getMaxAudioBitrate('aac', audioBitrate)
|
const maxAudioBitrate = getMaxAudioBitrate('aac', audioBitrate)
|
||||||
if (maxAudioBitrate !== -1 && audioBitrate > maxAudioBitrate) return false
|
if (maxAudioBitrate !== -1 && audioBitrate > maxAudioBitrate) return false
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -268,8 +268,7 @@ class LiveManager {
|
||||||
? await getLiveTranscodingCommand({
|
? await getLiveTranscodingCommand({
|
||||||
rtmpUrl,
|
rtmpUrl,
|
||||||
outPath,
|
outPath,
|
||||||
resolutions:
|
resolutions: allResolutions,
|
||||||
allResolutions,
|
|
||||||
fps,
|
fps,
|
||||||
deleteSegments,
|
deleteSegments,
|
||||||
availableEncoders,
|
availableEncoders,
|
||||||
|
|
|
@ -216,19 +216,19 @@ describe('Test multiple servers', function () {
|
||||||
files: [
|
files: [
|
||||||
{
|
{
|
||||||
resolution: 240,
|
resolution: 240,
|
||||||
size: 189000
|
size: 270000
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
resolution: 360,
|
resolution: 360,
|
||||||
size: 278000
|
size: 359000
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
resolution: 480,
|
resolution: 480,
|
||||||
size: 384000
|
size: 465000
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
resolution: 720,
|
resolution: 720,
|
||||||
size: 706000
|
size: 788000
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
thumbnailfile: 'thumbnail',
|
thumbnailfile: 'thumbnail',
|
||||||
|
|
|
@ -157,6 +157,8 @@ describe('Test a single server', function () {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should upload the video', async function () {
|
it('Should upload the video', async function () {
|
||||||
|
this.timeout(10000)
|
||||||
|
|
||||||
const videoAttributes = {
|
const videoAttributes = {
|
||||||
name: 'my super name',
|
name: 'my super name',
|
||||||
category: 2,
|
category: 2,
|
||||||
|
|
Loading…
Reference in New Issue