在Windows上使用PulseAudio播放来自Linux的远程音频

发布于 2024-03-24  623 次阅读


使用VNC控制树莓派时,总是感觉不太完美,因为VNC不支持传输音频。得被迫体验没有声音的世界,我作为精神洁癖和完美主义者,肯定是不能接受没有声音的世界的。

使用第三方维护的服务端(推荐)

由于PulseAudio官方服务端不维护了,有一个版本更新的第三方维护的,版本比较新的客户端:PulseAudio-win32可以使用。

PulseAudio Builds for Windows (pgaskin.net)

运行pasetup.exe文件,依次勾选下图所示的安装选项,

打开windows设置,网络和Internet,以太网,选择和你Linux机器在的同一个网络,将网络配置设置成专用。

使用官方服务端(不推荐)

在windows上其实是有官方的服务端的,但是自2012起已经不再更新,可能会有很多bug,已不推荐使用官方服务端。

从freedesktop.org下载Preview版本的服务端。

PulseAudio on Windows – PulseAudio (www.freedesktop.org)

解压缩压缩包到一个文件夹,编辑etc/pulse/daemon.conf文件,编辑第39行为如下内容,防止在无客户端连接时pulseaudio服务器自动退出:

; exit-idle-time = -1

其次编辑etc/pulse/default.pa文件,在末尾添加如下内容:

### 开启网络传输,默认端口为4713端口,请勿占用
load-module module-native-protocol-tcp listen=0.0.0.0 auth-cookie-enabled=false auth-ip-acl=127.0.0.0/8;192.168.31.0/24

注:远程传输时,添加对应ip或对应ip段到auth-ip-acl=后来允许连接,使用分号分隔多个ip。

接下来直接运行bin/pulseaudio.exe,此时服务启动,关闭控制台窗口则退出服务。

可以进入bin文件夹,在空白处按住shift+右键,点击“在此处打开PowerShell窗口”,输入如下命令验证pulseaudio服务器是否正常工作,如果正常会输出服务器版本信息。

./pactl.exe --server=127.0.0.1:4713 info

在Linux上远程连接到Windows上的PulseAudio实例

方案1:

打开终端,输入如下命令建立远程音频连接:

pactl load-module module-tunnel-sink-new server=你的windows电脑的ip:4713 channels=2 sink_name=windows32
pactl set-default-sink windows32

此时系统默认音频将直接从windows电脑上播放,无需重启应用,系统的声音设置里会多出一个音频设备。

方案2(不推荐):

使用PULSE_SERVER=ip:port环境变量启动程序,程序将试图连接服务器作为音频输出。

故障排除

连接失败,音频设置里没有多出音频设备

在linux上使用终端运行命令:pactl --server=你windows电脑的ip:4713 info,应该会提示PulseAudio服务器的版本信息。如果连接失败不显示,请检查windows上的控制面板,windows defender防火墙 ,允许pulseaudio.exe通过防火墙。

在linux使用pactl load-module module-tunnel-sink-new命令时,提示Failure: no such entity

解决办法:

我不知道啊

截至编写这篇文章时,这是pipewire-pulse独有的bug,无法正常加载module-tunnel-sink-new模块。请把你的音频服务器从pipewire-pulse切换成pulseaudio。