簡體   English   中英

在 ffmpeg 中規范化音頻 - 如何?

[英]Normalizing audio in ffmpeg - how?

我正在使用我正在編寫的 C# 應用程序為合唱團創建其中一個“Brady Bunch”視頻,該應用程序使用 ffmpeg 進行所有繁重的工作,並且在大多數情況下它運行良好,但我無法獲得音頻電平正好。

我現在正在做的是首先“標准化”來自各個歌手的音頻,如下所示:

  • 使用 ffmpeg 將音頻提取到 WAV 文件中
  • 使用 NAudio 將 WAV 文件加載到我的應用程序中
  • 找到最大的 16 位值
  • 當我創建合並的視頻時,為此流指定一個音量,將最大值提升到 32767

因此,例如,如果我有 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 倍。

  1. 混合音頻后,運行

ffmpeg -i output.mp3 -filter:a volumedetect -map 0:a -f null /dev/null

  1. 像這樣從字符串中獲取值:

[Parsed_volumedetect_0 @ 0xdigitsletters] max_volume: -16.5 dB

  1. 添加過濾此值,但為正值: ...]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM