我在同一个局域网上有两台独立的 Linux 计算机。一台计算机有扬声器,另一台计算机有显示器。要播放带有视频和声音的电影,我有两个选择:
- 使用扬声器在计算机上播放电影,并通过网络将视频传输到带有显示器的计算机上。
- 使用显示器在计算机上播放电影,并通过网络将音频传输到使用扬声器的计算机。
第一个选项使用 X11 转发效果很好:
$ ssh -X computer1
$ mpv movie.avi
对于第二种选择,我尝试了PulseAudio 的网络设置/etc/pulse/default.pa
,在两台电脑上设置以下内容:
load-module module-native-protocol-tcp auth-anonymous=1
load-module module-zeroconf-publish
load-module module-zeroconf-discover
然后,我在带显示器的电脑上运行mpv
。这样可以,但音频太不连贯,导致电影无法观看。为什么流式传输视频没有问题,而流式传输音频却很难?未压缩的视频不是比未压缩的音频占用更多的带宽吗?
答案1
您说得对,带宽不是问题。您遇到的是抖动和欠载。解决此问题的经典方法是增加延迟(这样软管就不会干涸,可以这么说)。
对于 PulseAudio 本身,在 中/etc/pulse/daemon.conf
,增加default-fragment-size-msec
,也许还有default-fragments
。另请参阅 中的调度部分https://linux.die.net/man/5/pulse-daemon.conf,以及讨论可能还
需要对 TCP 连接进行进一步的参数调整,但我对这方面不太熟悉。
答案2
为了我自己和其他任何人将来的参考,以下是我用来成功传输音频而没有缓冲区不足的设置。只要两个系统都有良好的网络连接,它就可以完美运行。(对我来说,在 2.4 GHz WiFi 上它很不稳定,但在 5 GHz WiFi 上它很好。)
我们将带扬声器的系统speakers
和带屏幕的系统称为screen
。
在两个系统上,安装 Zeroconf 模块:
$ sudo apt install pulseaudio-module-zeroconf
在 上
speakers
,将以下内容添加到/etc/pulse/default.pa
:load-module module-native-protocol-tcp load-module module-zeroconf-publish
在 上
screen
,将以下内容添加到/etc/pulse/default.pa
:load-module module-zeroconf-discover
将文件
~/.config/pulse/cookie
从screen
复制到speakers
(或者反过来,大概)。screen
运行时pavucontrol
设置输出设备。如下面的截图所示,系统自动添加了以下“虚拟输出设备”(这也表明我的speakers
系统实际上名为sea
)。