Jak odtwarzać film, słuchając jednocześnie dwóch ścieżek dźwiękowych?

10

Mam pliki filmowe z wieloma ścieżkami audio (w kontenerze MKV). Chcę obejrzeć film, wysyłając jeden język do głośników (dla dzieci) i inny język do słuchawek (dla mnie), utrzymując synchronizację utworów, jeśli film jest wstrzymany itp.

Załóżmy, że mój system ma już poprawnie skonfigurowane dwa wyjścia audio.

Czy można to zrobić za pomocą odtwarzacza multimediów w systemie Linux? Do tej pory sprawdziłem MPlayera i VLC, a one obsługują tylko wybranie jednej z dostępnych ścieżek audio.

Martin Vidner
źródło
1
Zadajesz pytanie nie na temat (zakupy oprogramowania). Pytania dotyczące rekomendacji produktów, usług lub materiałów szkoleniowych są nie na temat. Zobacz temat . Wypróbuj softwarerecs.stackexchange.com, ale najpierw przeczytaj Co jest wymagane, aby pytanie zawierało „wystarczającą ilość informacji” .
DavidPostill
Może mógłbyś ponownie zakodować plik, łącząc oba strumienie audio w jeden. Więc jeśli jeden ma 5.1, a drugi to stereo, miałbyś 8-kanałowy strumień. Możesz zmapować te kanały na różne urządzenia wyjściowe za pomocą Soundflower na OS X, ale nie wiem o Linuksie. Brzmi bardzo niewygodnie. Możesz także użyć czegoś takiego jak Adobe Premiere lub inny NLE, aby zamapować różne ścieżki audio na różne wyjścia.
Elliott B
Obawiam się, że „dzieci” już nauczyły się innego języka ... przynajmniej mam nadzieję. :-)
Hastur
Możesz także zmiksować ścieżki audio do stereo, a następnie umieścić je wszystkie w ścieżce audio 5.1 (ignorując kanały środkowy / subwoofer), a następnie zmiksować je z powrotem do filmu. Następnie możesz grać na dowolnej karcie dźwiękowej 5.1, wystarczy podłączyć słuchawki i głośniki do odpowiedniego wyjścia.
JonasCz - Przywróć Monikę

Odpowiedzi:

3

Pomysł

alias Jak rozbić muchę (masło) na kole [ Fly ] .

Możesz przesyłać strumieniowo lokalnie cały film ze wszystkimi ścieżkami audio i napisami, np vlc. Za pomocą .
Wtedy wystarczy „ podłączyć” dwóch klientów do tego strumienia, wybierając język (i / lub napisy) oraz różne wyjście audio (które zakładamy, że zostało już skonfigurowane).

Co więcej, w przypadku nowego telewizora, tabletu lub telefonu komórkowego nie jest konieczne uruchamianie klientów na komputerze ... a po włączeniu pauzy streamer zostaje wstrzymany ... i powinien również działać z systemem Windows (zawsze zakładane wyjście audio już skonfigurowane może z programami trzeciej części, w przypadku, gdy chcesz uruchomić dwóch klientów na komputerze).

Kilka słów więcej

Typowa linia poleceń przesyłania strumieniowego może być podobna do

vlc "movie.mkv" --sout-all --sout="#rtp{dst=239.255.100.100,port=5004,mux=ts}"

Potrzebna jest opcja --sout-all [ SO ]

 --sout-all, --no-sout-all  Enable streaming of all ES (default disabled)
 Stream all elementary streams (video, audio and subtitles) (default disabled)

Przeczytaj, vlc -Haby uzyskać wskazówki dotyczące innych (ton) dostępnych opcji.

Aby „odtworzyć” strumień

vlc rtp://239.255.100.100:5004  --audio-track=x

gdzie x jest liczbą strumienia audio, który chcesz słuchać na tym kliencie.
Wszystko powinno być łatwe do wykonania również z interfejsu GUI serwera / klienta ...

Referencje i dalsze odczyty
Możesz przeczytać więcej na stronie blogu Luuka „Użyj VLC do odtwarzania wielu klipów wideo na wielu komputerach w synchronizacji” [ 1 ] , możesz w końcu spróbować dodać zewnętrzną ścieżkę audio, zaczynając od strony wiki videolan [ 2 ] , lub możesz grać z Gstreamerem i innym wyjściem, jak sugeruje Antonio w tej odpowiedzi [ 3 ] .

GStreamer:
# Liczba i kolejność ścieżek musi być znana…

gst-launch-1.0 \
filesrc location=example.mkv ! decodebin name=decoded \
decoded.src_0 ! queue ! autovideosink \
decoded.src_1 ! queue ! audioconvert ! alsasink device=”hw:1,0″ \
decoded.src_2 ! queue ! audioconvert ! alsasink device=”hw:2,0″

Powyższe polecenie Gstreamera może być minimalną działającą odpowiedzią samą w sobie lub ścieżką do uratowania muchy (masła) ...
... ale rzadko mam ochotę bronić własnego pseudonimu.

Hastur
źródło
Uwaga: adres IP RST musi mieścić się w zakresie od 224.0.0.0 do 239.255.255.255 (zakres multiemisji IP), w przeciwnym razie nie będzie można połączyć się z nim więcej niż klient. Wygląda na to, że każde takie IP będzie po prostu działać.
chx
@chx Daj mi znać, jeśli pomysł działa z innym problemem ...
Hastur,
Tak! Napisałem to superuser.com/a/1422462/41259, ale myślałem, że ten szczegół warto tutaj wymienić.
chx
0

Rozwiązanie przesyłania strumieniowego ma wadę - klienci używają pamięci podręcznej i mogą stracić synchronizację. Zdarzyło mi się.

Innym podejściem do jednoczesnego uruchamiania dwóch różnych ścieżek, które uznałem za przydatne, jest uruchomienie dwóch instancji VLC i zsynchronizowanie ich odtwarzania. Ale nie można tego zrobić poprawnie bez automatyzacji (ręczne działania wykonywane jeden po drugim, które powodują opóźnienia).

Rozwiązaniem jest kontrolowanie obu instancji VLC synchronicznie za pomocą interfejsu sieciowego. Można go włączyć za pomocą GUI lub konsoli:

vlc --extraintf=http --http-host 127.0.0.1 --http-port 8081 --http-password any_password

Dla każdej instancji VLC użyj różnych portów. Do sterowania odtwarzaniem wystarczy jedno polecenie - pauza przełącz: http://:[email protected]:8081/requests/status.xml?command=pl_pause"

Więcej informacji na temat poleceń.

W takim przypadku wystarczy zrobić program / skrypt, który wysyła żądanie HTTP do obu identyfikatorów URI jednocześnie. Napisałem dla niego bardzo prosty program golang (tutaj jest kod źródłowy ). JS jest kolejnym dobrym kandydatem do tego celu. Idąc dalej, możliwe jest tworzenie większej liczby poleceń, przypisywanie globalnych powiązań klawiszy do tego programu / skryptu.

Główny punkt, w którym podejście działa dobrze.

Valera Leontyev
źródło