[英]Normalizing audio in ffmpeg - how?
我正在使用我正在編寫的 C# 應用程序為合唱團創建其中一個“Brady Bunch”視頻,該應用程序使用 ffmpeg 進行所有繁重的工作,並且在大多數情況下它運行良好,但我無法獲得音頻電平正好。
我現在正在做的是首先“標准化”來自各個歌手的音頻,如下所示:
因此,例如,如果我有 3 個流:流 A 的最大音頻已經是 32767,流 B 的最大音頻是 32000,流 C 的最大音頻是 16000,那么當我合並這些視頻時,我會指定
[0:a]volume=1.0,aresample=async=1:first_pts=0[aud0]
[1:a]volume=1.02,aresample=async=1:first_pts=0[aud1]
[2:a]volume=2.05,aresample=async=1:first_pts=0[aud2]
[aud0][aud1][aud2]amix=inputs=3[a]
(我有一個額外的“音量調整”,可以讓我根據需要調整個別歌手的音量級別,但對於這個問題我們可以忽略它)
我正在閱讀有關Audio Volume Manipulation的 ffmpeg wiki,接下來我將實現它,但我不知道如何處理它生成的輸出。 看起來我將獲得以 dB 為單位的平均和最大音量級別,雖然我以“是的,我 30 年前在大學里學到的那些”的方式理解分貝,但我不知道如何使用這些值標准化我的輸入視頻的音頻。
問題是,在 ffmpeg 輸出視頻中,音頻電平非常低。 如果我對ffmpeg生成的合並視頻中的WAV文件進行提取音頻和查看WAV文件的相同過程,則最大值僅為4904。
如何實現自動將輸出音量設置為“合理”水平的算法? 我意識到我可以簡單地添加一個手動音量過濾器並讓人工設置級別,但這將是生成合並視頻、收聽視頻、調整級別、再次合並等的大量工作。我想要我的應用程序計算出合適的輸出音量的一種方式(可能允許人工調整)。
編輯
要求 ffmpeg 確定每個剪輯的平均和最大音量確實提供了以 dB 為單位的平均和最大音量,然后我可以使用這些值來縮放每個輸入剪輯:
[0:a]volume=3.40dB,aresample=async=1:first_pts=0[aud0]
[1:a]volume=3.90dB,aresample=async=1:first_pts=0[aud1]
[2:a]volume=4.40dB,aresample=async=1:first_pts=0[aud2]
[3:a]volume=-0.00dB,aresample=async=1:first_pts=0[aud3]
但我最后的視頻仍然出奇地安靜。 現在,我添加了一個手動輸入的音量系數,該系數會在最后應用:
[aud0][aud1][aud2]amix=inputs=3[a]
[a]volume=volume=3.00[b]
所以我的問題是,實際上,我如何通過算法確定最終的體積因子需要是多少?
更多編輯
這里有一些更深層次的事情,我只是將音量過濾器設置為 100,輸出只是稍微響亮一點。 這是我的過濾器,以及命令行的相關部分:
color=size=1920x1080:c=0x0000FF [base];
[0:v] scale=576x324 [clip0];
[0:a]volume=1.48,aresample=async=1:first_pts=0[aud0];
[1:v] crop=808:1022:202:276,scale=384x486 [clip1];
[1:a]volume=1.57,aresample=async=1:first_pts=0[aud1];
[2:v] crop=1160:1010:428:70,scale=558x486 [clip2];
[2:a]volume=1.66,aresample=async=1:first_pts=0[aud2];
[3:v] crop=1326:1080:180:0,scale=576x469 [clip3];
[3:a]volume=1.70,aresample=async=1:first_pts=0[aud3];
[4:a]volume=0.20,aresample=async=1:first_pts=0[aud4];
[5:a]volume=0.73,aresample=async=1:first_pts=0[aud5];
[6:v] crop=1326:1080:276:0,scale=576x469 [clip4];
[6:a]volume=1.51,aresample=async=1:first_pts=0[aud6];
[base][clip0] overlay=shortest=1:x=32:y=158 [tmp0];
[tmp0][clip1] overlay=shortest=1:x=768:y=27 [tmp1];
[tmp1][clip2] overlay=shortest=1:x=1321:y=27 [tmp2];
[tmp2][clip3] overlay=shortest=1:x=32:y=625 [tmp3];
[tmp3][clip4] overlay=shortest=1:x=672:y=625 [tmp4];
[aud0][aud1][aud2][aud3][aud4][aud5][aud6]amix=inputs=7[a];
[a]adelay=delays=200:all=1[b];
[b]volume=volume=100.00[c];
[c]asplit[a1][a2];
ffmpeg -y ....
-map "[tmp4]" -map "[a1]" -c:v libx264 "D:\voutput.mp4"
-map "[a2]" "D:\aoutput.mp3""
當我這樣做時,我想要的音頻會更響亮(響亮到足以剪輯和失真),但絕對不會響亮 100 倍。
ffmpeg -i output.mp3 -filter:a volumedetect -map 0:a -f null /dev/null
[Parsed_volumedetect_0 @ 0xdigitsletters] max_volume: -16.5 dB
...]amix=inputs=7,volume=16.5dB[a]
[編輯]
混合音頻后做。
[更新]
我做了一些調查:
[更新2]
#!/bin/bash
f="input 1.mp3"
INP=("-ss" "30" "-i" "$f")
FCT=1
FLA="[0:a:0]aresample=async=1:first_pts=0[0a0]; "
AUD="[0a0]"
MAX=$(ffmpeg -hide_banner -i "$f" -map 0:a -filter:a volumedetect -f null /dev/null 2>&1 | grep 'max_volume' | awk '{print $4, $5, $6}')
echo " $FCT $MAX"
for f in /mnt/sklad/Музыка/*.mp3; do
INP+=("-ss" "30" "-i" "$f")
FLA+="[${FCT}:a:0]aresample=async=1:first_pts=0[${FCT}a0]; "
AUD+="[${FCT}a0]"
((FCT++))
printf -v OUT "%02d" $FCT
ffmpeg -v error -hide_banner "${INP[@]}" -filter_complex "${FLA} ${AUD}amix=inputs=${FCT}[a]" -map [a] -c:a aac -q:a 4 -t 30 -y "out_${OUT}.mkv"
MAX=$(ffmpeg -hide_banner -i "$f" -map 0:a -filter:a volumedetect -f null /dev/null 2>&1 | grep 'max_volume' | awk '{print $5, $6}')
echo " $FCT $MAX"
done
for f in out_*.mkv; do
MAX=$(ffmpeg -hide_banner -i "$f" -map 0:a -filter:a volumedetect -f null /dev/null 2>&1 | grep 'max_volume' | awk '{print $5, $6}')
echo " $f $MAX"
done
輸出:
1 max_volume: -1.1 dB
2 -0.2 dB
3 0.0 dB
4 -1.9 dB
5 -0.1 dB
6 -0.9 dB
7 0.0 dB
8 0.0 dB
9 0.0 dB
10 0.0 dB
11 0.0 dB
12 0.0 dB
13 -0.5 dB
14 -1.1 dB
15 0.0 dB
16 0.0 dB
17 -0.0 dB
out_02.mkv -4.4 dB
out_03.mkv -5.0 dB
out_04.mkv -6.8 dB
out_05.mkv -7.1 dB
out_06.mkv -8.3 dB
out_07.mkv -8.9 dB
out_08.mkv -8.9 dB
out_09.mkv -8.8 dB
out_10.mkv -8.9 dB
out_11.mkv -9.7 dB
out_12.mkv -10.3 dB
out_13.mkv -11.1 dB
out_14.mkv -11.3 dB
out_15.mkv -10.6 dB
out_16.mkv -10.9 dB
out_17.mkv -11.2 dB
得到其他結果,但仍然沒有強模式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.