在 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

发表评论?

1 条评论。

  1. 使用 XLaunch 一键启动 WSL 中的 Gnome 3 | Chloride Factory - pingback on 2018 年 5 月 9 日 在 上午 6:33

发表评论


注意 - 你可以用以下 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="">

Trackbacks and Pingbacks: