Как воспроизвести фильм, слушая две звуковые дорожки одновременно?

1187
Martin Vidner

У меня есть файлы фильмов с несколькими звуковыми дорожками (в контейнере MKV). Я хочу смотреть фильм, отправляя один язык на динамики (для детей) и другой язык на наушники (для себя), синхронизируя треки, если фильм приостановлен, и т. Д.

Предположим, что моя система уже имеет два правильно настроенных аудиовыхода.

Есть ли способ сделать это с помощью медиаплеера в Linux? До сих пор я проверял MPlayer и VLC, и они поддерживают только выбор одной из доступных звуковых дорожек.

8
Вы задаете не по теме вопрос (покупка ПО). Вопросы по поиску рекомендаций по продуктам, услугам или учебным материалам не по теме. См. [По теме] (http://superuser.com/help/on-topic). Попробуйте http://softwarerecs.stackexchange.com/, но сначала прочтите [Что требуется, чтобы вопрос содержал «достаточно информации»] (http://meta.softwarerecs.stackexchange.com/questions/336/what-is- требуется в обмен на а-вопрос-к-содержат-достаточно-информации). DavidPostill 8 лет назад 1
Возможно, вы могли бы перекодировать файл, объединяя оба аудиопотока в один. Так что если один 5.1, а другой стерео, у вас будет 8-канальный поток. Вы можете отобразить эти каналы на разные устройства вывода, используя Soundflower на OS X, но я не знаю о Linux. Звучит очень неудобно. Вы также можете использовать что-то вроде Adobe Premiere или другой NLE для отображения разных звуковых дорожек на разные выходы. Elliott B 8 лет назад 0
Я боюсь, что "дети" уже выучили другой язык ... по крайней мере, я надеюсь. `` :-) Hastur 7 лет назад 0

2 ответа на вопрос

2
Hastur

The Idea

aka How to break a (butter)fly on the wheel [Fly].

You can stream locally the whole movie with all the audio and subtitle tracks, e.g. with vlc.
Then it will be "enough" to connect two clients to that stream, selecting the language (and/or subtitles) and the different audio output (that we assume already configured).

Moreover with a new television, tablet or mobile phones it is not needed to run the clients on the computer... and when you put in pause the streamer you put in pause all... and it should work with windows too (always assumed the audio output already configured maybe with third part programs, in the case you want to run the two clients on the computer).

Some words more

A typical streaming command line can be similar to

vlc "movie.mkv" --sout-all --sout="#rtp" 

It is needed the option --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) 

Read vlc -H to have some hints for the other (tons of) options available.

To "play" the stream

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

where x is the number of the audio stream you want to listen on that client.
All should be easily done from the server/client GUI too...

References and further readings
You may want to read more from the Luuk's blog page "Use VLC to play multiple video clips on multiple computers in sync" [1], you can eventually try to add external audio track starting from this wiki page of videolan [2], or you can play with Gstreamer and different output as suggested by Antonio in this answer [3].

GStreamer:
# The number and order of the tracks must be known…

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″ 

The above Gstreamer command can be a minimal working answer by itself or a path to save the (butter)fly...
... but seldom I'm tempted to defend my own nickname.

0
Valera Leontyev

Потоковое решение имеет недостаток - клиенты используют кеш, и они могут выйти из синхронизации. Это случилось со мной.

Другой подход для одновременного запуска двух разных треков, который я нашел полезным для себя, - запустить два экземпляра VLC и синхронизировать их воспроизведение. Но я не могу сделать правильно без автоматизации (ручные действия выполняются одно за другим, что вызывает задержки).

Решение состоит в том, чтобы управлять обоими экземплярами VLC синхронно, используя веб-интерфейс. Его можно включить через графический интерфейс или консоль:

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

Для каждого экземпляра VLC используйте разные порты. Для управления воспроизведением достаточно одной команды - переключение паузы: http://:any_password@127.0.0.1:8081/requests/status.xml?command=pl_pause"

Больше информации о командах.

В этом случае все, что вам нужно сделать, это создать программу / скрипт, который отправляет HTTP-запрос на оба URI одновременно. Я написал очень простую программу для golang (вот исходный код ). JS является еще одним хорошим кандидатом для этой цели. Если пойти дальше, можно сделать больше команд, назначить глобальные привязки клавиш для этой программы / скрипта.

Главное, что подход работает хорошо.

Похожие вопросы