我正在尝试在Raspberry Pi上设置PulseAudio接收器,以便从那里的PC传输所有系统声音。最好的方法是什么?

例如,可以看电影还是等待时间太长?我前一段时间使用gstreamer进行了尝试,但延迟约为2秒,这对我的要求没有用。

评论

我确实有一两秒钟的延迟。

#1 楼

希望在网络上建立“直接连接”的官方说明仅对大多数人有用,但似乎pulseaudio和我相处得并不好:花了我几个小时。 [除了“直接连接”之外,您还可以使用下文进一步介绍的“隧道”方法,但是我建议您先阅读此内容。]
我现在有一个(fedora 17)桌面流向pi发送声音。我已最小化了两侧的/etc/pulse配置文件。在桌面端:
/etc/pulse/client.conf
# See man pulse-client.conf
default-server = tcp:192.168.2.13:4713

我的pi的LAN地址带有默认的pulseaudio端口。但是这让我有些困惑-在指定了服务器的情况下,pulseaudio甚至无法启动: .conf?)。但是,事实证明,您根本不必在桌面(发送)端运行它,而pulseaudio文档中并未对此进行说明。使用lsof -i -P似乎可以为各种媒体播放器使用较低级别的插件。
因此,实际上,在台式机/客户端上只需要一行“ client.conf”,如果要做的就是使用网络(但请参见下面的“更多复杂性”)。
虽然pulseaudio守护程序(在接收/服务器端)可以作为系统服务运行,但pulse的开发人员还是建议不要这样做。在pi上,init脚本仅会发出警告:您仍然必须自己启动它。 Fedora甚至不包含针对它的systemd引导服务条目。
因此,在pi端,您应该显式启动和停止Pulseaudio服务器进程,因此应进行以下配置:
/etc/pulse/daemon.conf
> pulseaudio --start
N: [pulseaudio] main.c: User-configured server at tcp:192.168.2.13:4713, refusing to start/autospawn.

exit-idle-time可以使用-1以使守护程序无限期地运行。请注意,这是秒,默认值是20(这意味着如果不设置该设置,它将“神秘地”消失)。
/etc/pulse/default.pa
# See man pulse-daemon.conf
log-level = info
exit-idle-time = 10800 # 3 hours

由于这是一个网络应用程序,因此以root用户身份运行它不是一个好主意。但是,正如在man pulseaudio中提到的,“降低”过程以使其具有更高的优先级也是一个好主意。您可以使用nice手动执行此操作,但是如果可执行文件为“ setuid”,则pulseaudio将自动为root或pulse-rt组的成员执行此操作,这意味着它可以利用某些root权限,然后转换为正确的非特权uid (pingpasswd也需要这样做)。因此(作为root或sudo):
# See man default.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.2.0/24
load-module module-alsa-sink device=hw:0,0

在raspbian上安装pulseaudio时,没有创建pulse-rt组,因此:
chmod u+s /usr/bin/pulseaudio

这会给你一个1003.将pi用户(例如)添加到该组:
groupadd pulse-rt

但是在raspbian上,您仍然无法将pi作为pi。为此,请添加到/etc/security/limits.conf中:
usermod -aG pulse-rt pi

在进行这些更改之前,您实际上必须先登录。如果您在pi上使用ssh,则只需使用login即可。现在您可以启动pulseaudio,它会自动降低-11,这可能比大多数其他进程的优先级更高(请看top中的NICE值)。
在播放从网络流传输的声音时,pulseaudio在pi使用大约10%的CPU和少量的内存。 :)它和我的桌面在有线局域网上;脉冲流传输原始pcm数据(我相信),因此带宽使用量对应于源的采样率,即1 kB / s或更高。不幸的是,如果您正在观看视频,声音会有明显的滞后。
还有更多并发症...
不幸的是,我的PC上的各种声音应用程序都无法立即运行。 mpg123根本不会运行。为此,在fedora上,您需要mpg123-plugins-pulseaudio软件包。对于浏览器中的Flash内容(例如youtude),您需要alsa-plugins-pulseaudio(实际上是连接到远程服务器的内容)。其他发行版应具有类似的软件包。如果您以前曾使用过pulseaudio(我不是),则可能已经安装了它们。
KDE的桌面铃声和哨子也无法正常工作。这是一个较难解决的问题,因为它正在寻找本地的pulseaudio服务器,并且如上所述,使用直接连接意味着无法在本地运行任何服务器。解决此问题的方法是使用“隧道”方法。
module-tunnel-sink
这是Pulseaudio文档中提到的另一种方法。在这种情况下,您的服务器两边都在运行,而另一手则移交给另一台。为此,请注释掉/etc/client.conf中的“默认服务器”,并添加包含以下内容的本地/etc/default.pa
@pulse-rt       hard nice -20
@pulse-rt       soft nice -20

如果不放入sink_name,pulseaudio将不会启动。 sink引用pi端的接收器名称,然后还需要一个名称。将相应的sink_name添加到module-alsa-sink中的default.pa行中:
load-module module-tunnel-sink sink_name=rpi_tunnel server=tcp:192.168.2.13:4713 sink=bcm1

两侧启动服务器并保存...。现在,包括KDE哔哔声在内的所有内容都被携带了,但浏览器Flash的播放却严重停顿了。但是,在另一个桌面环境(实际上只是一个窗口管理器,fvwm)下就可以了。
我喜欢KDE但可以无毛病地生活,所以现在我将继续使用直接连接。 />问题排查
如果有问题,请在pi上使用pulseaudio -vvvv --log-level=debug提供许多调试消息。最初,当我在pi上听不到声音时,报告了一个“与ALSA bcm2835驱动程序中的错误有关的问题”,这对我来说似乎很奇怪,因为仅凭alsa声音就可以了,并且我确定周围有pi软件在pulseaudio上-apt-get remove pulseaudio和重新安装apt-get install pulseaudio似乎可以解决此问题...我不喜欢看到一种解决方案,但是,嘿,至少现在我可以聆听tish,而不必将扬声器插入每个盒子。主要是

评论


感谢您的广泛回答。但是,有一个问题:Pi发出的音频会怎样?

– Vincent
15年4月12日在14:50

Dunno,如果我尝试过(我不再这样做了),但pulseaudio应该是一个多路复用器,因此它应该可以工作。

– goldilocks♦
2015年4月12日15:00