windows - 在 Windows 11 的 WSL 上的 Docker 容器中播放声音
问题描述
较新版本的 Windows(构建 21364 或更高版本)在 WSL2 中启用 GUI 支持,包括完整的音频支持。这是相当惊人的。
鉴于 WSL2 现在支持音频,那么我们如何使用 Docker 的 WSL2 引擎让音频在 Windows 上运行的 Docker 容器中工作?
在 Linux 主机上,您可以简单地调用 Docker 映像,例如--device /dev/snd
.
从 Windows 命令行运行启用声音的 Docker 映像的等效命令是什么?
解决方案
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
推荐阅读
- mysql - 具有 EBS 的 Kubernetes 持久卷(在 EC2 实例中)
- php - 如何从文本文件story.txt中打印最长和最短的单词并在php中找到每个单词的频率?
- c - C 编程:将长整数传递给函数并返回一个字符串
- c++ - 链接库错误 c/缺少 dll/错误版本?
- javascript - 将大型模型列表从视图发送到控制器 c# mvc razor
- python - 将 Python 列表列表转换为 MATLAB 稀疏矩阵
- python - 如何根据使用 tkinter 和 python 的 quixo 游戏在按钮网格上的每个按钮上添加文本
- python - 从给定的整数列表创建直方图
- xcode - 如果@EnvironmentObject,如何创建通用?
- powershell - 如何将 $input 自动变量转换为列表(在结束块中)?