理念

理念

我有带多个音轨的电影文件(在 MKV 容器中)。我想一边看电影一边将一种语言发送到扬声器(供孩子们使用),将另一种语言发送到耳机(供我自己使用),如果电影暂停,则保持音轨同步,等等。

假设我的系统已经正确配置了两个音频输出。

有没有办法用 Linux 中的媒体播放器来实现这一点?到目前为止,我已经检查了 MPlayer 和 VLC,它们仅支持选择其中一个可用音轨。

答案1

理念

又名如何打破车轮上的(蝴蝶)苍蝇 []

您可以在本地流式传输整部电影及其所有音频和字幕轨道,例如使用vlc
然后它将“足够的”将两个客户端连接到该流,选择语言(和/或字幕)和不同的音频输出(我们假设已经配置)。

此外,有了新的电视、平板电脑或手机,就不需要在计算机上运行客户端了……当你暂停流媒体时,你就暂停了所有内容……它也应该适用于 Windows(始终假设音频输出已经配置好了,也许使用第三方程序,如果你想在计算机上运行两个客户端的话)。

多说几句

典型的流式命令行类似于

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

需要选项--sout-all [所以]

 --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 是您想要在该客户端上收听的音频流的编号。
所有操作也应该可以从服务器/客户端 GUI 轻松完成...

参考文献和进一步阅读
您可能想从 Luuk 的博客页面阅读更多内容“使用 VLC 在多台计算机上同步播放多个视频片段” [1],你最终可以尝试从 videolan 的这个 wiki 页面开始添加外部音轨[2],或者你可以使用 Gstreamer 和不同的输出,正如 Antonio 在这个答案中所建议的那样[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 命令本身可以是最小的工作答案,也可以是拯救(蝴蝶)苍蝇的路径……
但我很少会试图捍卫自己的昵称。

答案2

流式传输解决方案有一个缺点——客户端使用缓存,因此它们可能会不同步。我就遇到过这种情况。

我发现另一种同时运行两个不同曲目的方法是运行两个 VLC 实例并同步播放,这对我自己很有用。但如果没有自动化,我无法正确完成(手动操作逐一进行会导致延迟)。

解决方案是使用 Web 界面同步控制两个 VLC 实例。可以通过 GUI 或控制台启用它:

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

对于每个 VLC 实例,使用不同的端口。要控制播放,一个命令就足够了——暂停切换: http://:[email protected]:8081/requests/status.xml?command=pl_pause"

更多信息在命令上。

在这种情况下,您要做的就是编写一个程序/脚本,同时向两个 URI 发送 HTTP 请求。我为此编写了一个非常简单的 golang 程序(这里是源代码)。JS 是实现此目的的另一个不错的选择。更进一步,可以创建更多命令,为该程序/脚本分配全局键绑定。

该方法的主要优点是效果良好。

相关内容