Jer*_*ose 1 windows audio docker wsl-2
较新版本的 Windows(内部版本 21364 或更高版本)在 WSL2 中启用 GUI 支持,包括完整的音频支持。这真是太神奇了。
鉴于 WSL2 现在支持音频,我们如何使用 Docker 的 WSL2 引擎让音频在 Windows 上运行的 Docker 容器内工作?
在 Linux 主机上,您可以简单地使用例如 来调用 Docker 映像--device /dev/snd。
从 Windows 命令行运行启用声音的 Docker 映像的等效命令是什么?
/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)