首页 > 解决方案 > 在 Windows 11 的 WSL 上的 Docker 容器中播放声音

问题描述

较新版本的 Windows(构建 21364 或更高版本)在 WSL2 中启用 GUI 支持,包括完整的音频支持。这是相当惊人的。

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

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

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

标签: windowsdockeraudiowsl-2

解决方案


WSL中没有/dev/snd或直接的音频硬件仿真可用,即使在新的 Windows 11 设置中也是如此。相反,最新版本的 WSL 通过将 PulseAudio 客户端通过/mnt/wslg/. 该服务器在另一个名为 WSLg 的 Linux 发行版上运行,该发行版在 Windows 内部运行,其唯一目的是在 WSL 发行版和 Windows 之间连接音频和图形数据

它看起来有点像这样:

Docker container <-> WSL <-> WSLg <-> Windows 11

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

# On WSL   
echo $PULSE_SERVER
/mnt/wslg/PulseServer

因此,除了确保您的 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

或从 Windows 命令行,如:

wsl docker run -t -i -e "PULSE_SERVER=/mnt/wslg/PulseServer" -v /mnt/wslg/:/mnt/wslg/ image_name

或者

docker run -t -i -e "PULSE_SERVER=/mnt/wslg/PulseServer" -v \\wsl$\Ubuntu\mnt\wslg:/mnt/wslg/ image_name

推荐阅读