我使用网络音频设备(而非 Multicast/RTP)的 PulseAudio 功能,在家时在连接到 HTPC 的音频设备上播放上网本的声音。这会创建一个虚拟音频设备,然后我可以使用它来代替物理内置设备。大多数情况下,这都很好用。但有时,虚拟音频设备就是不出现。断开网络连接并重新连接有时会有所帮助,但并非总是如此,而且这很烦人,并且可能对现有的 TCP 连接不利。
所以我的问题基本上是:有没有办法告诉PulseAudio“嘿,如果你真的找不到网络声音设备。”?
编辑:卸载并重新加载module-zeroconf-discover
也pacmd
无济于事,而且出现本身就是 avahi 问题,因为avahi-browse -t --all | grep PulseAudio
显示了很多看起来正确的东西,即使这些设备没有在 pavucontrol 或 中列出pacmd list-sinks
。
编辑2:我在两个盒子上都使用了 Ubuntu 12.04,以了解它可能带来的各种差异。
答案1
- 在“接收器”PC(您想要在其扬声器上播放声音)上,通过进入终端并发出以下命令来打开 PulseAudio 命令 shell。
$ pacmd
您将看到一个类似 Python 的 shell,其中包含以下欢迎消息。
Welcome to PulseAudio! Use "help" for usage information. >>>
- 通过 PulseAudio shell 中的命令列出 PC 上可以播放声音的设备。
>>> list-sinks
现在您将看到所有声音接收器的详细列表。 - 只需记下完整的姓名您选择的接收器。它将作为声卡的属性出现。例如,在我的情况下它是:
1 sink(s) available. index: 0 name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
...
我感兴趣的字符串只是“alsa_output.pci-0000_00_1b.0.analog-stereo”
- 现在进入源 PC(即音频多媒体流的来源),打开终端并发出以下命令。
$ pactl load-module module-tunnel-sink "server=192.168.1.105 sink=alsa_output.pci-0000_00_1b.0.analog-stereo sink_name=home_theater"
这里 192.168.1.105 是接收 PC 的 IP 地址,“alsa_output.pci-0000_00_1b.0.analog-stereo”是您刚从接收终端复制的字符串,“home_theater”只是在您的计算机上调用这个虚拟声音输出设备的花哨名称。 - 最后通过以下方式选择此虚拟声音设备:
$ pacmd set-default-sink home_theater
哇啦!!
答案2
简单sudo service avahi-daemon restart
操作即可,尽管avahi-browse
可以看到 avahi 重启之前的设备。感谢 Takkat 为我指明了正确的方向。
答案3
这个答案尚未经过测试,因此可能不起作用,但它可能会引导您走向正确的方向。
我可以确认尚未解决Avahi 服务存在问题有时无法连接到 PulseAudio 服务器。我们可以通过重新启动网络或 pulseaudio 服务器成功重新连接,但遗憾的是这并不总是有效。
为了解决这个问题,我们可以尝试使用本机 TCP 协议建立网络音频流以直接流式传输到 IP,而不是使用 Avahi 名称解析。
为此,我们可以通过加载模块隧道接收器在接收方。在发送方,我们必须通过加载模块本机协议 TCP。
另请参阅此问题以了解术语以及如何定义PULSE_SERVER
变量:
如何在启动时自动将 PulseAudio 默认接收器设置为远程服务器 - Ubuntu 9.04
对于 Ubuntu 9.04 来说这是一个相当老的问题,但据我所知,从那时起术语和程序并没有发生太大变化。
请同时关注PulseAudio Wiki 上的网络连接。
答案4
您可以尝试pulseaudio -k
,这会终止 pulseaudio 服务(它似乎会自动重新启动)。这之前曾让我恢复过问题。
另一个有时有帮助的方法就是取消勾选然后重新勾选Pulseaudio Preferences
(又名paprefs
) 中的复选框。复选框位于Make discoverable PulseAudio network sound devices available locally
和Network Access
中Enable network access to local sound devices
。Network Server
显然,这可能只适用于您正在使用的那个。