在 WSL 中使用 pulseaudio 播放声音

虽说微软最初发布 WSL 的时候就明确表示这是一个只针对开发者的平台,而现在的战略也只是更进一步支持服务器级别的应用,并没有支持桌面应用的计划(可是 CUDA 和 OpenCl 你总得支持吧),但我在很愉快地用它开发之余,也在很愉快地看热闹不嫌事大地企图让各种 GUI 应用跑起来. 得益于类 unix 系统上显示与音频的网络化设计,可以在 Linux 完全没有相关硬件资源的情况下通过网络方式用 Windows 上的服务器显示与播放,再加上 WSL 和 Win32 本身就是同一内核上的两个子系统,这样做相当于就是在原生 Linux 上正常使用声音与显示,只是没有高效的 unix socket 罢了.

关于 WSL 上跑 GUI 的相关文章已经相当多了,然而播放声音的却没有一篇完整的教程. 这里将介绍如何使用 pulseaudio 来让 WSL 播放声音.

我使用的系统版本:Windows 10 Creators Update.


设置 pulseaudio 服务端

首先要下载 Windows 上的 pulseaudio 作为服务端. 下载完毕后解压到任意文件夹,假设是 X:\pulseaudio\.

运行服务器之前首先要进行配置. 打开 X:\pulseaudio\etc\pulse\default.pa 并将 load-module module-native-protocol-tcp 前的井号去掉,然后在行末加上 listen=127.0.0.1 auth-anonymous=1. 这样 pulseaudio 就可以监听 TCP 端口上的请求了. 然后打开 X:\pulseaudio\etc\pulse\daemon.conf 并将 ;exit-idle-time = 20 改为 exit-idle-time = -1,这样 pulseaudio 就不会在播放声音后自动退出.

然后进入 X:\pulseaudio\bin 并按住 Shift 键在空白处单击右键,选择「在此处打开 Powershell 窗口」.

运行 .\pulseaudio.exe 以启动 pulseserver 的服务端.

Pulseaudio Server

此时可以先测试 pulseaudio 的服务端是否运作正常. 在相同文件夹中打开 PowerShell 并执行 .\paplay.exe -p --server=tcp:localhost C:\Windows\Media\ding.wav,如果运作正常,Windows 应该会播放「叮」的一声.


设置 pulseaudio 客户端

进入 WSL 并打开 ~/.bashrc,在最后添加一行 export PULSE_SERVER=tcp:localhost,然后关闭 bash 窗口重新打开. 同样地,可以使用 paplay -p /mnt/c/Windows/Media/ding.wav 进行测试.

然后在 WSL 中执行以下命令:

这会覆盖 Ubuntu 自带的 pulseaudio 库. 默认的编译选项里启用了 WSL 目前所不支持的 syscall,因此需要这样打补丁.


运行播放声音的软件

至此 pulseaudio 已经设置完毕了,可以尝试各种播放声音的软件了.

这里推荐尝试 Firefox 播放 YouTube 视频. 不过墙内的朋友就比较麻烦了,因为 Firefox 并不自带 Flash 插件,而国内的视频网站你懂的…

如果要在 Unity 里播放声音的话需要使用 paprefs 启动网络播放.

效果图:

YouTube in WSL

发表评论?

4 条评论。

  1. 使用 XLaunch 一键启动 WSL 中的 Gnome 3 | Chloride Factory - pingback on 2018年5月9日 在 上午6:33
  2. 执行
    2
    sudo add-apt-repository ppa:therealkenc/wsl-pulseaudio
    的时候,会出现有一个源404了,有别的方法吗?

    root@DESKTOP-VSPHV6B:~# sudo add-apt-repository ppa:therealkenc/wsl-pulseaudio
    A one-liner change to src/pulsecore/mutex-posix.c adding #undef HAVE_PTHREAD_PRIO_INHERIT to work around missing futex() surface in WSL.
    More info: https://launchpad.net/~therealkenc/+archive/ubuntu/wsl-pulseaudio
    Press [ENTER] to continue or Ctrl-c to cancel adding it.

    Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
    Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
    Ign:3 http://ppa.launchpad.net/therealkenc/wsl-pulseaudio/ubuntu bionic InRelease
    Hit:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
    Hit:5 http://archive.ubuntu.com/ubuntu bionic-backports InRelease
    Err:6 http://ppa.launchpad.net/therealkenc/wsl-pulseaudio/ubuntu bionic Release
    404 Not Found [IP: 91.189.95.83 80]
    Error connecting: Could not connect: Connection refused
    Reading package lists… Done
    E: The repository ‘http://ppa.launchpad.net/therealkenc/wsl-pulseaudio/ubuntu bionic Release’ does not have a Release file.
    N: Updating from such a repository can’t be done securely, and is therefore disabled by default.
    N: See apt-secure(8) manpage for repository creation and user configuration details.

    • 不需要这个源了,当时 WSL 兼容性还不足以跑 PulseAudio 所以有人做了补丁。现在直接用官方源就好了。

  3. 【收集整理】学习资料整理 – Gooney小站 - pingback on 2020年12月14日 在 下午5:03

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Trackbacks and Pingbacks: