问题 如何将Docker容器中的音频暴露给Mac?


我知道在Linux主机系统上使用脉冲音频是可能的但是 paprefs 是为linux而不是mac而构建的。


6869
2017-10-19 16:10


起源



答案:


Docker-for-Mac VM没有任何声音直通设备,因此没有任何东西可以从这个角度利用。相比之下,虚拟机或vmware融合虚拟机确实能够传输直通音频。

我能够使用以下命令安装pulseaudio并使用OSX工作:

brew install pulseaudio

我能够通过运行以下内容验证这是否有效,听到声音来自我的扬声器:

paplay cockatiel.wav

我的下一步是找到一份包含副本的图像 paplay。我发现 杰斯/的pulseaudio,似乎是一个脉冲音频 服务器,但我应该可以用它作为 客户 同样。

我在Archlinux Wiki上找到了以下指南,讨论如何设置pulseaudio网络声音: https://wiki.archlinux.org/index.php/PulseAudio/Examples#PulseAudio_over_network

通过执行以下操作,我能够适应这种情况。我编辑了 /usr/local/Cellar/pulseaudio/9.0/etc/pulse/default.pa 在我的Mac上,并取消注释以下两行:

load-module module-esound-protocol-tcp
load-module module-native-protocol-tcp

我重申 paplay cockatiel.wav 在我的Mac上,以确保我的更改仍然有效。 pulseaudio守护进程似乎是按需启动的,并将其投诉传回 paplay 如果我打错了,就打印在我的屏幕上。我对default.pa的更改仍然有声音,所以我很满意我的更改没有破坏任何东西。

接下来,我在一个像这样的容器中运行pulseaudio客户端:

docker run --rm -v $HOME:$HOME -w $HOME -it \
  -e PULSE_SERVER=192.168.10.23 \
  -e HOME=$HOME --entrypoint paplay \
  jess/pulseaudio $HOME/cockatiel.wav

这样做是使用我的本地主目录作为卷运行容器。这有两个目的。首先是我的cockatiel.wav位于里面 $HOME。第二个是因为客户端和服务器都需要有相同的副本 ~/.config/pulse/cookie 文件(根据archlinux wiki指南)。

PULSE_SERVER 环境变量是我的OSX主机的en0 IP地址,因此paplay知道要连接的内容。

HOME 环境变量是必要的,所以paplay可以找到相同的 ~/.config/pulse/cookie 文件。

我能够通过pulseaudio从我的docker-for-mac上运行的容器中播放声音。

只要你得到了 ~/.config/pulse/cookie 文件出现在正确的位置,你应该能够播放声音。您不必使用主机卷来完成此操作 - 您也可以执行'docker cp',甚至是 COPY 它变成了一个图像。


12
2017-10-19 18:28



运行paplay时我遇到以下错误piano2.wav $ paplay piano2.wav W:[] caps.c:通常所有额外的功能都会被删除,但这是不可能的,因为PulseAudio是在没有功能支持的情况下构建的。连接失败:连接被拒绝pa_context_connect()失败:连接被拒绝 - valentin_nasta
@valentin_nasta你是否设法解决了在Mac上安装PulseAudio的问题? - Paul Sturgess
使用当前的PulseAudio 10.0,运行“pulseaudio --daemonize = false -v”似乎无法启动,在添加两个模块-esound-protocol之后,获取“W:[] socket-util.c:IP_TOS失败:无效参数” -tcp / module-native-protocol-tcp lines。 - jamshid


答案:


Docker-for-Mac VM没有任何声音直通设备,因此没有任何东西可以从这个角度利用。相比之下,虚拟机或vmware融合虚拟机确实能够传输直通音频。

我能够使用以下命令安装pulseaudio并使用OSX工作:

brew install pulseaudio

我能够通过运行以下内容验证这是否有效,听到声音来自我的扬声器:

paplay cockatiel.wav

我的下一步是找到一份包含副本的图像 paplay。我发现 杰斯/的pulseaudio,似乎是一个脉冲音频 服务器,但我应该可以用它作为 客户 同样。

我在Archlinux Wiki上找到了以下指南,讨论如何设置pulseaudio网络声音: https://wiki.archlinux.org/index.php/PulseAudio/Examples#PulseAudio_over_network

通过执行以下操作,我能够适应这种情况。我编辑了 /usr/local/Cellar/pulseaudio/9.0/etc/pulse/default.pa 在我的Mac上,并取消注释以下两行:

load-module module-esound-protocol-tcp
load-module module-native-protocol-tcp

我重申 paplay cockatiel.wav 在我的Mac上,以确保我的更改仍然有效。 pulseaudio守护进程似乎是按需启动的,并将其投诉传回 paplay 如果我打错了,就打印在我的屏幕上。我对default.pa的更改仍然有声音,所以我很满意我的更改没有破坏任何东西。

接下来,我在一个像这样的容器中运行pulseaudio客户端:

docker run --rm -v $HOME:$HOME -w $HOME -it \
  -e PULSE_SERVER=192.168.10.23 \
  -e HOME=$HOME --entrypoint paplay \
  jess/pulseaudio $HOME/cockatiel.wav

这样做是使用我的本地主目录作为卷运行容器。这有两个目的。首先是我的cockatiel.wav位于里面 $HOME。第二个是因为客户端和服务器都需要有相同的副本 ~/.config/pulse/cookie 文件(根据archlinux wiki指南)。

PULSE_SERVER 环境变量是我的OSX主机的en0 IP地址,因此paplay知道要连接的内容。

HOME 环境变量是必要的,所以paplay可以找到相同的 ~/.config/pulse/cookie 文件。

我能够通过pulseaudio从我的docker-for-mac上运行的容器中播放声音。

只要你得到了 ~/.config/pulse/cookie 文件出现在正确的位置,你应该能够播放声音。您不必使用主机卷来完成此操作 - 您也可以执行'docker cp',甚至是 COPY 它变成了一个图像。


12
2017-10-19 18:28



运行paplay时我遇到以下错误piano2.wav $ paplay piano2.wav W:[] caps.c:通常所有额外的功能都会被删除,但这是不可能的,因为PulseAudio是在没有功能支持的情况下构建的。连接失败:连接被拒绝pa_context_connect()失败:连接被拒绝 - valentin_nasta
@valentin_nasta你是否设法解决了在Mac上安装PulseAudio的问题? - Paul Sturgess
使用当前的PulseAudio 10.0,运行“pulseaudio --daemonize = false -v”似乎无法启动,在添加两个模块-esound-protocol之后,获取“W:[] socket-util.c:IP_TOS失败:无效参数” -tcp / module-native-protocol-tcp lines。 - jamshid


安装 的PulseAudio 在Mac上:

brew install pulseaudio

运行守护进程:

pulseaudio --load=module-native-protocol-tcp --exit-idle-time=-1 --daemon

在您的Docker容器中:

  1. 安装PulseAudio,例如, apt-get install pulseaudio
  2. 设置以下环境变量: ENV PULSE_SERVER=docker.for.mac.localhost

当你运行它,分享你的 ~/.config/pulse 目录与容器进行身份验证。

您可以运行测试以查看它是否像这样工作:

docker run -it -e PULSE_SERVER=docker.for.mac.localhost -v ~/.config/pulse:/home/pulseaudio/.config/pulse --entrypoint speaker-test --rm jess/pulseaudio -c 2 -l 1 -t wav

1
2018-06-20 03:58