Prawidłowo przenieś 5.1 na stereo, używając ffmpeg

27

Mam ścieżkę audio 5.1 z filmu, w którym przedni lewy i przedni prawy zawiera muzykę, a środek zawiera dialog. Odtwarzanie ścieżki 5.1 w VLC ładnie łączy wszystko.

Próbuję przekonwertować ścieżkę 5.1 na stereo przy użyciu ffmpeg -ac 2, jednak powstały miks stereo ma znacznie słabszą głośność niż odtwarzanie ścieżki 5.1 w sposób natywny.

Dodanie -af "pan=stereo|c0=FL|c1=FR"daje prawidłową głośność, ale wtedy nie ma dialogu, ponieważ kanał środkowy nie jest uwzględniony.

Więc rozwiązaniem może być miksowanie lewego / środkowego / prawego w stereo i wyrzucenie tylnych kanałów subwoofera? (Zgaduję tutaj ...)

Pytanie zatem brzmi: w jaki sposób mogę zmiksować ffmpeg 5.1 do stereo w ten sam sposób, w jaki robi to VLC, z takim samym silnym poziomem głośności w wyniku końcowym?

naprzód
źródło
Czy na pewno VLC odtwarza dodatkowe kanały? Downmixowanie może doprowadzić do normalizacji, dzięki czemu suma każdego wejścia na kanał wyjściowy nie spowoduje przeciążenia, dzięki czemu zapobiega się przycinaniu. Może to sprawić, że będzie brzmiało ciszej.
llogan
Podstawy: mój plik to 5.1. Moje głośniki są stereo. Nie wiem, co robi VLC, ale tworzy świetny efekt końcowy w moich głośnikach stereo z danych źródłowych 5.1 (duża głośność, zarówno muzyka, jak i dialog). Z drugiej strony, ffmpeg tworzy „niski poziom głośności” podczas używania -ac 2. Pytam więc, jak sprawić, by ffmpeg generował taki sam dobry wynik jak VLC.
forwardrin

Odpowiedzi:

29

Znalazłem odpowiedź, której udzielił Shane, aby podać za mało innych kanałów i za dużo środka. Filmy ze słuchawkami brzmiały niezrównoważone, ze wszystkimi dialogami i niewystarczającą ilością podkładu muzycznego / efektów.

Zgodnie ze standardami ATSC (sekcja 7.8, strona 91) w celu downmixu 5.1 do konwencjonalnego stereo (w przeciwieństwie do matrycy) zastosowano następujący wzór:

Lo = 1.0 * L + clev * C + slev * Ls ;
Ro = 1.0 * R + clev * C + slev * Rs ;

clev i slev powinny wynosić .707, zgodnie z tabelami 5.9 i 5.10 w wyżej wymienionym dokumencie, zakładając poziom miksu środkowego / surround wynoszący 0. Inne wartości podano w tych tabelach, które zmniejszają ilość miksu środkowego, którego nie znalazłem przydatny.

Mając to na uwadze, następująca opcja ffmpeg zapewnia dobrze zrównoważony dźwięk z słyszalnym dialogiem. Pamiętaj, że określenie kanałów audio nie jest konieczne.

-af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR"

Uwaga na temat używania symbolu „mniej niż” z dokumentacji filtra filtra :

Jeśli „=” w specyfikacji kanału zostanie zastąpione przez „<”, wówczas wzmocnienia dla tej specyfikacji zostaną ponownie znormalizowane, tak aby suma wynosiła 1, unikając w ten sposób szumu przycinającego.

Gregory
źródło
5
Standardy ATSC, do których się tutaj odnosisz, zostały powiązane z wiki FFmpeg na ten temat , więc nic dziwnego, że zastosowana tu formuła jest taka sama jak implementowana przez FFmpeg z ac -2przełącznikiem. Innymi słowy, jedyną różnicą między używaniem tego filtra a robieniem ac -2jest dużo więcej pisania.
Hashim
@Hashim Nie tylko pisanie. Odpowiedź z dokładnym wyjaśnieniem podstaw jest obiektywnie lepsza niż „wpisz to, aby uzyskać”.
Sevastyan Savanyuk
18

Odpowiedzi na to pytanie stały się trochę bałaganu, z których wiele zawiera zbędne informacje, a inne całkowicie nieścisłości. Ta odpowiedź jest próbą usprawnienia informacji zawartych w tych odpowiedziach, jednocześnie eliminując występujące w nich problemy.

Co najważniejsze, warto pamiętać, że odpowiedź Gregory'ego, która jest obecnie najczęściej głosowaną odpowiedzią na to pytanie, nie różni się od użycia -ac 2przełącznika - więcej na ten temat poniżej.

Downmixowanie 5.1-kanałowego strumienia audio do stereo za pomocą -ac 2

FFmpeg posiada wbudowane możliwości downmixowania ścieżki 5.1 do stereo, i jest to również rozwiązanie zalecane przez własną dokumentację FFmpeg :

Uwaga: ffmpeg integruje domyślny system miksowania w dół (i miksowania w górę), który powinien być preferowany ( -acopcja) nad filtrem panoramowania, chyba że masz bardzo specyficzne potrzeby.

-ac 2Przełącznik działa poprzez mieszanie proporcje pierwszych 5 kanałów z potoku 6-kanałowego źródła firmy - z tyłu z lewej, z tyłu po prawej, przedni lewy, przedni prawy i środkowy przedni - w kanałach lewym przednim i przedni prawy strumienia wyjściowego stereo:

wprowadź opis zdjęcia tutaj

W tym przypadku dźwięk z kanału LFE ( .1 w 5.1, zarezerwowany dla subwoofera i używany do efektów głębokich, o niskiej częstotliwości) jest całkowicie odrzucany podczas korzystania z tej opcji.

Niestety, w moich testach -ac 2uzyskano ogólne poziomy zarówno muzyki, jak i dialogów, które najbardziej różniły się od źródła, co czyni go formułą downmixu, która daje najgorsze wyjście spośród wszystkich testowanych formuł, chociaż można to przetestować i przekonać się, że to zapewnia idealnie odpowiedni downmix dla twoich potrzeb, w takim przypadku użycie innej formuły byłoby dla ciebie przesadą.


Aby zmiksować ścieżkę DTS -ac 2 bez transkodowania (tj. Aby zachować ten sam kodek i rozszerzenie):

ffmpeg -i "sourcetrack.dts" -c:a dca -ac 2 "stereotrack.dts"

Jak zauważył Mephisto w swojej odpowiedzi, jeśli dialog i muzyka brzmią dla ciebie dobrze zrównoważone, ale po prostu brakuje głośności, możesz zmiksować strumień, jednocześnie zwiększając jego głośność:

ffmpeg -i "sourcetrack.dts" -c:a dca -ac 2 -vol 425 "stereotrack.dts"

W przypadku -volprzełącznika 100% głośności w źródle odpowiada wartości całkowitej 256, a użycie większej wartości spowoduje zwiększenie ogólnej głośności strumienia audio. Należy jednak pamiętać, że zbyt duże działanie może spowodować zniekształcenie lub artefakty, zwłaszcza w głośniejszych sekcjach.

Aby zmiksować strumień audio do stereo i transkodować go do kodeka AC3, na przykład:

ffmpeg -i "sourcetrack.dts" -c:a ac3 -ac 2 "stereotrack.ac3"

Downmixowanie 5.1-kanałowego strumienia audio do stereo za pomocą niestandardowego algorytmu miksowania

Jeśli chcesz uzyskać bardziej wysokiej jakości downmix lub absolutnie musisz dołączyć strumień LFE do swojego wyjścia, możesz użyć przełącznika filtra audio FFmpeg ( -af), aby zmiksować dźwięk przy użyciu niestandardowej formuły miksowania.

Mieszanie z formułą ATSC (odpowiedź Gregory'ego)

W chwili opublikowania tej odpowiedzi najczęściej głosowaną odpowiedzią była Gregory , która umieszcza formułę ze specyfikacji ATSC (zob. Sekcja 7.8.2, Downmixowanie na dwa kanały ) w filtrze audio FFmpeg. Ta specyfikacja jest bezpośrednio powiązana z dokumentacją FFmpeg na ten temat , co wskazuje, że najprawdopodobniej będzie to ta sama formuła, którą FFmpeg już implementuje dla swojego -ac 2przełącznika. Jeśli to prawda, wpisanie całej formuły w odpowiedzi Gregory'ego nie różni się niczym od użycia -ac 2przełącznika, a zatem stratą czasu.

Zdecydowałem się to sprawdzić na pewno, przekodowując to samo wejście audio, używając zarówno -ac 2i -affiltru z odpowiedzi Gregory'ego (dokładne użyte polecenia można zobaczyć w przypisach do tej odpowiedzi).

Następnie porównałem rozmiary wynikowych plików wyjściowych i stwierdziłem, że były one bajt po bajcie tego samego rozmiaru:

wprowadź opis zdjęcia tutaj

Na koniec otworzyłem oba pliki wyjściowe w Audacity i porównałem ich przebiegi, aby potwierdzić, że są identyczne (kliknij, aby powiększyć):

wprowadź opis zdjęcia tutaj

Wydaje się zatem dość jednoznaczne, że formuła ATSC opisana w odpowiedzi Gregory'ego jest tą samą, która została już zaimplementowana przez FFmpeg , i że jej użycie jest całkowicie zbędne, gdy nic -ac 2nie robi, i jest o wiele bardziej kłopotliwym poleceniem.

Downmixowanie bez odrzucania kanału LFE (odpowiedź Dave_750)

Spośród kilku zawartych w odpowiedziach jest to jedyna formuła downmixu, która wydaje się miksować kanał LFE z wyjściowym stereo zamiast go całkowicie odrzucać, w wyniku czego ten, który zapewnia najmniejszy dźwięk ze źródła, jest Stracony.

Ogólny poziom głośności jest wyższy i pełniejszy niż w przypadku robienia tego -ac 2, ale nadal niższy niż poniżej downmixu Nightmode Dialogue. Jednak poziomy muzyki są znacznie bliższe źródłu niż downmix Nightmode Dialog, a dzięki włączeniu ścieżki LFE zwiększenie głośności wyjścia podczas korzystania z tej formuły downmixu może stworzyć strumień wyjściowy, który brzmi bardziej realistycznie dla źródła 5.1 niż wszystkie inne formuły, które testowałem.

Jeśli masz taką możliwość, zdecydowanie zaleciłbym kodowanie strumieni audio przy użyciu zarówno tej formuły downmixu, jak i downmixu Nightmode Dialogue oraz dokładne porównanie przebiegów tych dwóch w celu ustalenia, który z nich jest lepszy.

Aby zmiksować ścieżkę 5.1 do stereo przy użyciu tej formuły i zwiększyć jej głośność do 425 (gdzie 256 to 100% głośności pierwotnego źródła):

ffmpeg -i "sourcetrack.dts" -c dca -vol 425 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE" "outputstereo.dts"

Downmixowanie z Nightmode Dialogiem Roberta Colliera (odpowiedź Shane'a Harrelsona)

Formuła Nightmode Dialogue, stworzona przez Roberta Colliera na forum Doom9 i pozyskiwana przez Shane'a Harrelsona w jego odpowiedzi, powoduje znacznie lepszy downmix niż -ac 2przełącznik - zamiast zbyt cichych dialogów, przywraca je do poziomów, które są znacznie bliższe źródło.

Z opisu miksu Roberta Colliera:

Po przekonwertowaniu wielu ścieżek filmowych DTS z 5.1 na 2.0 za pomocą eac3to, znalazłem domyślne odwzorowania kanałów eac3to, co skutkuje bardzo cichymi dialogami i zbyt głośną muzyką i scenami akcji. Chociaż współczynniki downmixu kanału eac3to mają podstawy naukowe, często nie brzmią dobrze w praktyce z powodu niskiej głośności dialogu. To ustawienie wstępne jest przeznaczone dla osób poszukujących wyraźnych dialogów z muzyką lewego i prawego kanału, która nadal jest słyszalna, ale bardziej w tle.

Jak widać - środkowy przód (dialogi) wchodzą teraz prawidłowo i pozostają na oryginalnym poziomie - podczas gdy muzyka i eksplozje pozostają efektem tła i nie przytłaczają cię. To ustawienie wstępne rozwiązuje problem ciągłego majstrowania przy pokrętle głośności podczas oglądania DTS 5.1 przekonwertowanego na filmy 2.0, aby usłyszeć dialogi. (Szczególnie do oglądania filmów w nocy, gdy nie chcesz budzić innych, ale nadal chcesz słyszeć dialogi).

Niestety, muzyka tej formuły downmixu jest znacznie niższa niż w źródle 5.1 (co prawdopodobnie było projektowane biorąc pod uwagę zamiar Colliera stworzenia miksu „nightmode”), a ze względu na całkowitą utratę ścieżki LFE ogólny dźwięk wyjściowy nie dźwięk tak pełny lub bliski źródłu, jak formuła Dave_750 ze zwiększoną głośnością .

Jeśli jednak z jakiegoś powodu chcesz uniknąć zwiększenia ogólnej głośności strumienia, prawdopodobnie najlepszym rozwiązaniem byłaby opcja Tryb nocny - jednak ponownie zdecydowanie zaleciłbym zakodowanie strumienia audio do obu i ostrożne porównanie ich przebiegów .

Aby zmiksować z formułą Nightmode Dialogue w FFmpeg:

ffmpeg -i "sourcetrack.dts" -c dca -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" "stereotrack.dts" 

Odpowiedź Tarca

Ta odpowiedź po prostu umieszcza formułę downmixu Nightmode Dialogue z odpowiedzi Shane'a Harrelsona w poleceniu konwersji strumienia audio w kontenerze MKV. Chociaż polecenie podane w tej odpowiedzi działałoby dobrze na takim strumieniu audio, dostosowanie go do autonomicznej ścieżki dźwiękowej dałoby błąd:

Filtrowania i streamcopy nie można używać razem

Wynika to z faktu, że kodera audio nie można skopiować podczas miksowania w dół - podobnie jak wszystkie inne zmiany wprowadzane przez FFmpeg do strumienia wyjściowego, proces miksowania wymaga ponownego kodowania ścieżki w celu zastosowania zmian.

To polecenie zawierało również redundantny -ac 2przełącznik, który FFmpeg zignorowałby.


Testuj polecenia

Aby zademonstrować wiarygodność testów, które przeprowadziłem dla tej odpowiedzi, poniżej znajdują się wszystkie polecenia, których użyłem do przetestowania każdej formuły downmiksu.

Polecenie testowe użyte dla -ac 2opcji:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -ac 2 "Audio 1 (-ac 2).wav"

Polecenie testowe użyte do odpowiedzi Gregory'ego:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR" "Audio 2 (ATSC Algorithm Downmix).wav"

Polecenie testowe użyte do odpowiedzi Dave_750:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -vol 425 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE" "Audio 4 (Dave750 Downmix).wav"

Polecenie testowe użyte w odpowiedzi Shane'a Harrelsona:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" "Audio 3 (Nightmode Dialogue Downmix).wav"
Hashim
źródło
1
Imponujący wgląd! Dziękujemy za poświęcenie czasu na udostępnienie tego. Dziwne więc, że na początku -ac 2dałem mi gorszy wynik, co skłoniło do oryginalnego opublikowania. Spróbuję to jeszcze raz i jeśli to możliwe, podzielę się fragmentem 5.1, który nie daje zadowalającego rezultatu z wbudowanym miksowaniem. Również bardzo miło wiedzieć, że możesz miksować w dół bez transkodowania!
forwardrin
@forthrin Pamiętaj, że kodowanie i transkodowanie to dwie różne rzeczy. Transkodowanie konwertuje jeden kodek / rozszerzenie na inny, a kodowanie konwertuje na ten sam kodek / rozszerzenie. Możesz miksować w dół i stosować inne efekty FFmpeg do strumienia bez transkodowania, ale nie bez kodowania. Ta ac -2opcja dała mi również najgorszy wynik ze wszystkich formuł downmixu, myślę, że jest to po prostu błąd w formule standardu ATSC.
Hashim
Próbowałem tego teraz. Wygląda na to ffmpeg -i 5.1.mp4 -ac 2 2.mp4, że działa, ale ffplay -i 5.1.mp4 -ac 2nie działa.
forwardrin
9

Wypróbuj ten downmix:

-ac 2 -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" 

zgodnie z sugestią Roberta Colliera na forum Doom9.

Shane Harrelson
źródło
2
Co oznaczają wszystkie te opcje? Jeśli je wyjaśnisz, ludzie będą mogli użyć Twojej odpowiedzi do rozwiązania różnych problemów zamiast po prostu kopiowania i wklejania.
David Richerby,
2
@DavidRicherby -ac = Kanały audio (2 dla stereo), -af = Filtr audio
Cestarian 23.03.16
3
Próbowałem tego w przypadku filmu 5.1 i przynajmniej wyjściowy dźwięk stereo brzmiał dla mnie całkiem dobrze. Czysty dialog i nic innego nie wydawało się brakować. Byłoby wspaniale, gdyby ktoś ze znajomością VLC mógł udostępnić dokładnie to, co dzieje się w domyślnym downmixie 5.1 do 2.0.
forwardrin
2
@DavidRicherby: Opcje w filtrze audio (-af) to: FL = lewy przedni; BL = lewy tył; FC = przedni środkowy; FR = przedni prawy; BR = prawo w tył. Wartości zmiennoprzecinkowe są liniowymi czynnikami zmniejszającymi (<1) lub zwiększającymi (> 1) głośność zwielokrotnionego kanału. FL = FC + 0,30 * FL + 0,30 * BL ustawia kanał z lewego przedniego kanału na kanał z przodu środkowego plus 30% z lewego przedniego kanału i 30% z lewego tylnego kanału.
kronenpj
1
FWIW: Uważam, że ten miks sprawia, że ​​dialogi są zbyt głośne w porównaniu do muzyki i dźwięków otoczenia. Technicznie bardziej poprawny miks podany w odpowiedzi Tarca jest dla mnie o wiele bardziej przyjemny. Myślę, że być może będziesz musiał spróbować tego, co będzie dla ciebie najlepsze, zależy to od sytuacji.
jlh
3

Tak więc, łącząc @Shane Harrelson z odpowiedzią @Jordana Harrisa na inne pytanie - z włączonym trybem leniwym - tutaj jest to, co trzeba przekonwertować input_51.mkv(5.1) na output_stereo.mkv(stereo):

ffmpeg -i input_51.mkv -c:v copy \
    -ac 2 -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" \
    output_stereo.mkv

Te -c:v copyśrodki part że strumień wideo nie jest dotykane (chyba że v ideo c odec ustawienia jest bycie policjantem IED). Bez tego zajmie to znacznie dłużej. Samo powtórzenie powyższej odpowiedzi dla kompletności -ac 2oznacza dwa kanały audio i -afokreśla filtr audio.

Po lekkim przestudiowaniu polecenia doszedłem do wniosku, że ustawia on sposób komponowania dwóch kanałów stereo; FL(lewy przedni kanał) pobiera się od oryginału FC(centralny przedni) plus 0.30*FL(30% z przodu po lewej stronie) plus 0.30*BL(30% z tyłu z lewej) i tak dalej.

Tarc
źródło
Czy dzięki temu kanał centralny będzie spójny i słyszalny?
Freedo,
2

To jest stare pytanie, ale wskazało mi właściwy kierunek i chciałem podzielić się moim wynikiem:

-af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE"

Ustawienie połowy FC i LFE na lewy i prawy daje w sumie 1 dla ich efektywnej głośności z obu głośników. Korzystanie z .707 * Przód / tył Lewo / Prawo sprowadza te kanały do ​​dobrego poziomu, aby nie obezwładniały centrum.

Dave_750
źródło
1

Jeśli opcja -ac 2 zapewnia zrównoważony downmix, w którym ani muzyka, ani mowa nie brzmią o wiele bardziej niż inne komponenty, wystarczy zwiększyć głośność za pomocą

-vol 512

Użyłem 512 w tym przykładzie, co zwiększa dźwięk, czyniąc go dwa razy głośniejszym. Zasadą jest, że 256 odpowiada 100%

Nie wchodź zbyt wysoko z tą wartością i koniecznie sprawdź wyniki w tych częściach filmu z wybuchem lub głośnym hałasem. Bardzo łatwo jest wprowadzić zniekształcenie, używając zbyt wysokiej wartości.

Mefisto
źródło
1

-ac 2

Głośność kanałów w downmixie pozostaje niezmieniona dzięki kodekowi zmiennoprzecinkowemu -> pcm_f32le, aac

Głośność w downmixie (5.1 do 2.0 bez LFE) jest zmniejszona o 1 / 2,5 = -7,96 dB z kodekiem całkowitym -> pcm_s16le, libfdk_aac

Filmy mają dźwięk skierowany w jednym kierunku i brak maksymalnego ciśnienia dźwięku na wszystkich kanałach. Więc zmniejszona głośność downmixu jest zła, właściwa jest kompresja na niskim poziomie. Tak właśnie robi Dolby.

użytkownik1076138
źródło
0

Po przeczytaniu całej strony i kilku eksperymentów wpadłem na skrypt o nazwie „down_mix”:

#!/bin/bash -x

FL="0.5*FC + 0.707*FL + 0.707*BL + 0.5*LFE"
FR="0.5*FC + 0.707*FR + 0.707*BR + 0.5*LFE"
AUDIO_FMT="libopus"
CONTAINER="mkv"

ffmpeg -i "$1" -c:v copy -c:s copy \
    -c:a $AUDIO_FMT \
    -af "pan=stereo|FL=$FL|FR=$FR" \
    "${1%.*}"_dm.$CONTAINER

    # how to test a snippet of movie
    # -ss 41:07.0 -t 4 \

Dostosuj powyższe zmienne do swoich upodobań. Nie miałem problemu z niską głośnością, więc pominąłem to, ale łatwo dodałem.

Gringo Suave
źródło
0

Filtr ffmpeg „-ac 2” działa dobrze, dopóki twój cel jest zakodowany w pcm_s16le. Podczas kodowania do pcm_f32le w formacie wav głośność jest zwiększana o 9dB i więcej. Dlatego: W takich przypadkach nie należy używać filtra „-ac 2”.

Frank-Michael Fischer
źródło
Dlaczego zwiększa się głośność? Gdzie się o tym dowiedziałeś?
forwardrin 24.04.19
Nie mam pojęcia, dlaczego. Ale jestem bardzo częstym użytkownikiem ffmpeg (sam go kompiluję). Po prostu weź dowolne źródło 5.1 (boczne) i przekonwertuj je do pliku pcm_s16le i również do pliku wav pcm_f32le za pomocą „-ac 2” za każdym razem. Porównaj szczytowe objętości dwóch plików wav, a zobaczysz (i usłyszysz):
Frank-Michael Fischer
dzieje się tak przy użyciu np. wersji ffmpeg N-93636-g6829c3c
Frank-Michael Fischer