Opcja 1: Wbudowane filtry normalizujące
Obecny ffmpeg ma dwa filtry, które mogą być bezpośrednio użyte do normalizacji - chociaż są one już dość zaawansowane, więc nie stosują po prostu wzmocnienia, aby osiągnąć poziom szczytowy. Oto one:
-
loudnorm
: normalizacja głośności zgodnie z EBU R128. Można ustawić zintegrowany cel głośności, cel zakresu głośności lub maksymalny prawdziwy poziom szczytowy. Jest to zalecane dla publikowania audio i wideo i jest używane przez nadawców na całym świecie.
-
dynaudnorm
: “inteligentna” normalizacja głośności bez obcinania, która stosuje normalizację dynamicznie nad okienkowymi fragmentami pliku. Może to zmienić charakterystykę dźwięku, więc powinno być stosowane z ostrożnością.
Również filtr volume
może być użyty do wykonania prostej regulacji głośności. Zobacz wpis wiki Audio Volume Manipulation aby dowiedzieć się więcej.
Filtr loudnorm
może być użyty z jednym przejściem, ale zalecane jest wykonanie dwóch przejść, co umożliwia dokładniejszą normalizację liniową. Jest to trochę trudne do zautomatyzowania. Ponadto, jeśli chcesz “prostej” normalizacji opartej na RMS lub normalizacji szczytowej do 0 dBFS (lub dowolnego innego celu), czytaj dalej.
Opcja 2: Użyj narzędzia ffmpeg-normalize
Stworzyłem program w Pythonie do normalizacji plików multimedialnych , dostępny również na PyPi . Wystarczy:
- pobrać ffmpeg (wybrać static build, wersja 3. 1 lub wyższa)
- umieścić plik wykonywalny
ffmpeg
w swoim katalogu $PATH
, dodając go np. do /usr/local/bin
lub dodając jego katalog do $PATH
- uruchomić
pip install ffmpeg-normalize
- użyć
ffmpeg-normalize
Na przykład:
ffmpeg-normalize input.mp4 -o output.mp4 -c:a aac -b:a 192k
Albo, aby po prostu znormalizować partiami pewną liczbę plików audio i zapisać je jako nieskompresowane WAV do folderu wyjściowego:
ffmpeg-normalize *.m4a -of /path/to/outputFolder -ext wav
Narzędzie obsługuje EBU R128 (domyślnie), RMS i peak. Zajrzyj na stronę ffmpeg-normalize -h
po więcej opcji i sprawdź README po kilka przykładów.
Wspiera również ponowne kodowanie za pomocą innych koderów (np. AAC lub MP3), lub automatyczne łączenie dźwięku z powrotem do wideo.
Opcja 3: Ręczna normalizacja dźwięku za pomocą ffmpeg
W ffmpeg możesz użyć filtra volume
do zmiany głośności ścieżki. Upewnij się, że pobierzesz najnowszą wersję programu.
Ten przewodnik jest dla szczytowej normalizacji, co oznacza, że sprawi, że najgłośniejszy fragment w pliku będzie miał 0 dB zamiast czegoś niższego. Istnieje również normalizacja oparta na RMS, która próbuje uczynić średnią głośność taką samą w wielu plikach. Aby to zrobić, nie staraj się przesunąć maksymalnej głośności do 0 dB, ale średnią głośność do wybranego poziomu dB (np. -26 dB).
Ustal wzmocnienie, jakie należy zastosować
Najpierw należy przeanalizować strumień audio pod kątem maksymalnej głośności, aby sprawdzić, czy normalizacja w ogóle się opłaci:
ffmpeg -i video.avi -af "volumedetect" -vn -sn -dn -f null /dev/null
Zamień /dev/null
na NUL
w systemie Windows.
Argumenty -vn
, -sn
i -dn
nakazują ffmpegowi ignorowanie strumieni innych niż audio podczas tej analizy. To drastycznie przyspiesza analizę.
Spowoduje to wyświetlenie czegoś takiego jak poniżej:
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] mean_volume: -16.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] max_volume: -5.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] histogram_0db: 87861
Jak widać, nasza maksymalna głośność wynosi -5,0 dB, więc możemy zastosować wzmocnienie 5 dB. Jeśli uzyskamy wartość 0 dB, to nie ma potrzeby normalizowania dźwięku.
Zastosuj filtr głośności:
Teraz zastosujemy filtr volume
do pliku audio. Zauważ, że zastosowanie filtra oznacza, że będziemy musieli ponownie zakodować strumień audio. To, jaki kodek chcesz zastosować dla dźwięku, zależy oczywiście od jego oryginalnego formatu. Oto kilka przykładów:
Plain audio file: Po prostu zakoduj plik za pomocą dowolnego kodera, którego potrzebujesz:
FormatAVI: Zwykle jest tam dźwięk MP3 z wideo, które jest w kontenerze AVI:
Format MP4: Z kontenerem MP4, zwykle znajdziesz dźwięk AAC. Możemy użyć wbudowanego w ffmpeg kodera AAC.
W powyższych przykładach, strumień wideo zostanie skopiowany przy użyciu -c:v copy
. Jeśli w pliku wejściowym są napisy lub wiele strumieni wideo, użyj opcji -map 0
przed nazwą pliku wyjściowego.