![使用 PulseAudio 录制另一台计算机的监听源(输出混音)](https://linux22.com/image/116968/%E4%BD%BF%E7%94%A8%20PulseAudio%20%E5%BD%95%E5%88%B6%E5%8F%A6%E4%B8%80%E5%8F%B0%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E7%9B%91%E5%90%AC%E6%BA%90%EF%BC%88%E8%BE%93%E5%87%BA%E6%B7%B7%E9%9F%B3%EF%BC%89.png)
我正在设计一个基于 Raspberry Pi 的 LED 可视化墙,例如,它可以显示另一台计算机的声音输出的频谱。合理的选择是使用 PulseAudio 来监控 LAN 上的音频。
但有一个问题。我可以轻松地将音频从一台计算机播放到另一台计算机,还可以录制远程麦克风输入,因此我的基本设置没有任何问题,但由于某种原因,我无法录制应提供遥控器上播放的所有音频混合的监视器源电脑。我什至可以在 PulseAudio 音量控制 (pavucontrol) 的输入列表上看到远程监听源,但当选择它进行录音时,我得到的只是静音。本地监控源工作正常。接收器是具有常规立体声 PCM 的 HDMI 输出,而不是 AC3/DTS 直通。
我在这里错过了一些重要的东西吗?对监控源的网络访问是否因某种原因被阻止?
如果有解决方案,我也很高兴看到 CLI 替代方案,因为这是我的项目主要需要的。
我已经用尽了所有的 Google-fu,但没有成功,但如果以前没有人这样做过,我会感到惊讶。
更新:pacmd list-sources | grep name:
按要求添加了输出。由于 IPv6,隧道项目会列出两次,但这不是问题。
name: <alsa_output.pci-0000_00_1b.0.analog-stereo.monitor>
name: <alsa_input.pci-0000_00_1b.0.analog-stereo>
name: <tunnel.mediacenter.local.alsa_input.pci-0000_00_14.2.analog-stereo>
name: <tunnel.mediacenter.local.alsa_input.pci-0000_00_14.2.analog-stereo.2>
name: <tunnel.mediacenter.local.alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor>
name: <tunnel.mediacenter.local.alsa_output.pci-0000_00_14.2.iec958-stereo.monitor>
name: <tunnel.mediacenter.local.alsa_output.pci-0000_01_00.1.hdmi-stereo.2.monitor>
name: <tunnel.mediacenter.local.alsa_output.pci-0000_00_14.2.iec958-stereo.2.monitor>
答案1
我正在发布我自己的解决方案,这是在 PulseAudio 开发人员的帮助下找到的,以便其他人可以避免我的麻烦。
事实证明,该问题是 PulseAudio 10.0 的 Zeroconf 模块中的一个错误,并且可能迟早会得到修复。在此之前,唯一的解决方案(除了手动创建隧道之外)是直接从远程 PulseAudio 服务器录制,绕过隧道模块。不过,这可能不适用于 GUI 应用程序。记录远程监控源的命令示例:
PULSE_SERVER=REMOTE_HOST parecord --device=MONITOR_SOURCE > recording.wav
使用源的适当值替换 REMOTE_HOST 和 MONITOR_SOURCE当地的名称(即在我的例子中 alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor)。
类似的直接 PulseAudio 连接可以与 GStreamer 一起使用,GStreamer 具有方便的 CLI 工具和针对各种编程语言的绑定。在本地播放远程监控源的示例命令:
gst-launch-1.0 pulsesrc server=REMOTE_HOST device=MONITOR_SOURCE ! pulsesink
GStreamer 还可以提供频谱数据,这在可视化项目中可能很有用。间隔较长且无音频吞吐量的示例:
gst-launch-1.0 -m pulsesrc server=REMOTE_HOST device=MONITOR_SOURCE\
! spectrum interval=400000000 bands=10 threshold=-100 ! fakesink