在 Windows 11 中的 WSL 上的 Docker 容器中播放声音

Jer*_*ose 1 windows audio docker wsl-2

较新版本的 Windows(内部版本 21364 或更高版本)在 WSL2 中启用 GUI 支持,包括完整的音频支持。这真是太神奇了。

鉴于 WSL2 现在支持音频,我们如何使用 Docker 的 WSL2 引擎让音频在 Windows 上运行的 Docker 容器内工作?

在 Linux 主机上,您可以简单地使用例如 来调用 Docker 映像--device /dev/snd

从 Windows 命令行运行启用声音的 Docker 映像的等效命令是什么?

Jer*_*ose 6

/dev/snd即使在新的 Windows 11 设置中,WSL 中也没有或直接提供音频硬件模拟。相反,最新版本的 WSL 通过 .NET 中的套接字将 PulseAudio 客户端指向外部 PulseAudio 服务器来实现音频输出/mnt/wslg/该服务器在另一个名为WSLg 的 Linux 发行版上运行,该发行版在 Windows 内部运行,其唯一目的是在 WSL 发行版和 Windows 之间传输音频和图形数据

它看起来有点像这样:

Docker container <-> WSL <-> WSLg <-> Windows 11
Run Code Online (Sandbox Code Playgroud)

实际的 PulseAudio 服务器位于 WSLg 中。套接字的位置存储在环境变量中PULSE_SERVER

# On WSL   
echo $PULSE_SERVER
/mnt/wslg/PulseServer
Run Code Online (Sandbox Code Playgroud)

因此,除了确保您的 Dockerfile 具有基本的 PulseAudio 安装(RUN apt-get install -y pulseaudio或同等版本)之外,您所需要做的就是调用图像,如下所示:

在 WSL 中:

docker run -t -i -e "PULSE_SERVER=${PULSE_SERVER}" -v /mnt/wslg/:/mnt/wslg/ image_name
Run Code Online (Sandbox Code Playgroud)

或者从 Windows 命令行,例如:

wsl docker run -t -i -e "PULSE_SERVER=/mnt/wslg/PulseServer" -v /mnt/wslg/:/mnt/wslg/ image_name
Run Code Online (Sandbox Code Playgroud)

或者

docker run -t -i -e "PULSE_SERVER=/mnt/wslg/PulseServer" -v \\wsl$\Ubuntu\mnt\wslg:/mnt/wslg/ image_name
Run Code Online (Sandbox Code Playgroud)