编辑:在阅读 BMitch 关于不需要在本地计算机上播放的第一条评论后
我推荐使用pulseaudio,因为它的用户空间代码并且不需要内核模块。在我看来,alsa 不太可能适用于 docker(尽管我可能是错的)
如果我这样做:
apt-get update
apt-get install pulseaudio socat
apt-get install alsa-utils
apt-get install ffmpeg
# Start the pulseaudio server
pulseaudio -D --exit-idle-time=-1
# Load the virtual sink and set it as default
pacmd load-module module-virtual-sink sink_name=v1
pacmd set-default-sink v1
# set the monitor of v1 sink to be the default source
pacmd set-default-source v1.monitor
# Start the ffmpeg capture to an audio file
ffmpeg -f pulse -i default out.mp3
然后在一个单独的终端中
paplay /usr/share/sounds/alsa/Front_Center.wav
WAV文件的音频被ffmpeg捕获并出现在out.mp3中
我真的不知道你的 X 设置是什么样的,但如果你可以让音频进入 pulseaudio,那么 ffmpeg 将捕获音频而不需要真正的声卡
原答案:如果您想让音频进入 Mac OS 声卡
我最初访问此页面是因为我试图将音频从 VM 内播放到 Mac OS。但是,如果您不关心将其从 VM 中取出,那么以下内容就过于复杂了。我把它留在这里,因为这个想法是我最终来到这里的原因
可以在 VM 中使用 pulseaudio 将 WAV 文件播放到物理声卡。我在 Mac OS Sierra 上使用 docker 17.03.1-ce 并使用 brew 安装 sox。此设置还需要在 VM 上安装 socat,但我认为具有更多 pulseaduio 知识(或者如果我有更多时间)的人应该能够删除这部分
策略是使用paplay 通过pulseaudio 播放wav 文件,并让pulseaudio 通过网络在VM 启动时发布的端口上发送音频。在 Mac 端,您将连接到这个发布的端口并通过 sox 将数据发送到 Mac。
1. MAC: 使用已发布的端口拉取并运行映像
docker pull ubuntu
docker run -it --rm -p 127.0.0.1:3000:3000 ubuntu
2。 VM: 更新并安装所需的包
apt-get update
apt-get install pulseaudio socat
apt-get install alsa-utils
我只为 wav 文件安装 alsa-utils,所以你可以删除它
3. VM: 启动 pulseaudio 服务器
pulseaudio -D --exit-idle-time=-1
这告诉服务器分叉到后台而不是基于不活动退出
4. VM:为pulseaudio创建一个“接收器”
sink 是 pulseaudio 以特定格式发送音频数据的地方:
pacmd load-module module-pipe-sink file=/dev/audio format=s16 rate=44100 channels=2
这会将音频以 44100Hz 的带符号 16 位 2 声道发送到文件 /dev/audio。
5. VM: 将文件附加到网络
这个文件现在需要“附加”到网络上,socat 用于在发布的地址创建一个监听套接字(注意:这里没有验证)准备在 Mac 端连接时发送音频
socat file:/dev/audio tcp-listen:3000
6. MAC:从网络读取数据到sox
在 Mac 端,我们现在需要连接到此端口并通过 sox 将详细信息发送到音频驱动程序:
nc 127.0.0.1 3000 | sox -traw -r44100 -b16 -c2 -e signed-integer - -d
mac 默认有 netcat (nc),所以我在这里使用它来连接到发布的端口,然后将数据通过管道传输到 sox,并带有标志到 sox 以匹配上面“加载模块”语句中设置的值。
7. VM: 玩!
最后,使用pulseaudio包中的paplay可以播放WAV文件:
paplay /usr/share/sounds/alsa/Front_Center.wav
8. MAC:听着!
在 mac 端,您现在应该在这里看到音频,并且能够看到 sox 的输出,其中包括一个小电平表,这应该会移动:
$ nc 127.0.0.1 3000 | sox -traw -r44100 -b16 -c2 -e signed-integer - -d
-: (raw)
File Size: 0
Encoding: Signed PCM
Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
Duration: unknown
In:0.00% 00:00:06.78 [00:00:00.00] Out:299k [ | ] Clip:0
反向操作(即将 Mac 音频发送到 VM 上的 pulseaudio)也应该可以使用类似但反向的设置(module-pipe-source?)
我没有针对 ffmpeg 页面上的命令对此进行测试,因为我没有 X 服务器。