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

10

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

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

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

Мартин Виднер
источник
1
Вы задаете не по теме вопрос (покупка программного обеспечения). Вопросы по поиску рекомендаций по продуктам, услугам или учебным материалам не по теме. Смотрите по теме . Попробуйте softwarerecs.stackexchange.com, но сначала прочтите « Что требуется», чтобы вопрос содержал «достаточно информации» .
DavidPostill
Возможно, вы могли бы перекодировать файл, объединяя оба аудиопотока в один. Так что если один 5.1, а другой стерео, у вас будет 8-канальный поток. Вы можете отобразить эти каналы на разные устройства вывода, используя Soundflower на OS X, но я не знаю о Linux. Звучит очень неудобно. Вы также можете использовать что-то вроде Adobe Premiere или другой NLE для отображения разных звуковых дорожек на разные выходы.
Elliott B
Боюсь, что "дети" уже выучили другой язык ... по крайней мере, я надеюсь. :-)
Хастур
Вы также можете микшировать звуковые дорожки в стерео, затем помещать их все в звуковую дорожку 5.1 (игнорируя каналы центрального / сабвуфера), а затем микшировать их обратно в фильм. Затем вы можете играть на любой звуковой карте 5.1, просто подключите наушники и колонки к соответствующему выходу.
JonasCz - Восстановить Монику

Ответы:

3

Идея

aka Как сломать (масло) летать на колесе [ Fly ] .

Вы можете транслировать локально весь фильм со всеми звуковыми дорожками и дорожками субтитров, например, с помощью vlc.
Тогда будет «достаточно» подключить двух клиентов к этому потоку, выбрав язык (и / или субтитры) и другой аудиовыход (который мы предполагаем, уже настроен).

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

Еще несколько слов

Типичная потоковая командная строка может быть похожа на

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

Нужна опция --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)

Прочитайте, vlc -Hчтобы получить некоторые подсказки для других (тонны) доступных вариантов.

Для того, чтобы «играть» по течению

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

где x - номер аудиопотока, который вы хотите прослушать на этом клиенте.
Все должно быть легко сделано из графического интерфейса сервера / клиента тоже ...

Ссылки и дальнейшие чтения
Возможно, вы захотите прочитать больше на странице блога Luuk «Используйте VLC для синхронного воспроизведения нескольких видеоклипов на нескольких компьютерах» [ 1 ] , вы можете в конечном итоге попытаться добавить внешнюю звуковую дорожку, начиная с этой вики-страницы videolan [ 2 ] , или вы можете играть с Gstreamer и другим выводом, как это было предложено Антонио в этом ответе [ 3 ] .

GStreamer:
# Количество и порядок треков должны быть известны…

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″

Приведенная выше команда Gstreamer может быть минимальным рабочим ответом сама по себе или путем для спасения мухи (масла) ...
... но редко я испытываю желание защитить свой псевдоним.

Hastur
источник
Обратите внимание, что IP-адрес RST должен находиться в диапазоне от 224.0.0.0 до 239.255.255.255 (диапазон IP-адресов многоадресной рассылки), иначе вы не сможете подключиться к нему больше, чем клиент. Кажется, что любой такой IP будет просто работать.
chx
@chx Дай мне знать , если идея работает с другим вопросом ...
Хастура
Да, это так! Я написал это superuser.com/a/1422462/41259, но я подумал, что эту деталь стоит упомянуть здесь.
chx
0

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

Другой подход для одновременного запуска двух разных дорожек, который я нашел полезным для себя, - запустить два экземпляра 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 одновременно. Я написал очень простую программу для Голанга (вот исходный код ). JS является еще одним хорошим кандидатом для этой цели. Если пойти дальше, можно сделать больше команд, назначить глобальные привязки клавиш для этой программы / скрипта.

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

Валера Леонтьев
источник