在Ubuntu Docker Image上录制声音

Dan*_*son 15 audio ubuntu ffmpeg docker

ffmpeg当我捕捉屏幕时,我想录制音频.我在使用时遇到的错误alsa是我的图像没有声卡-f alsa -ac 2 -i hw:0

以下是如何在新版本的Ubuntu上重现

在新的ubuntu docker镜像中启动会话.

docker pull ubuntu
docker run -it --rm ubuntu
Run Code Online (Sandbox Code Playgroud)

安装alsa(高级Linux声音架构)

apt-get update
apt-get install alsa-utils
Run Code Online (Sandbox Code Playgroud)

列出声卡

aplay -l
# aplay: device_list:268: no soundcards found...
Run Code Online (Sandbox Code Playgroud)

播放此声音将失败,因为此图像没有任何声卡

sudo aplay /usr/share/sounds/alsa/Front_Center.wav
Run Code Online (Sandbox Code Playgroud)

spa*_*kle 15

编辑:在阅读第一条关于不需要播放到本地计算机的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
Run Code Online (Sandbox Code Playgroud)

然后在一个单独的终端

paplay /usr/share/sounds/alsa/Front_Center.wav
Run Code Online (Sandbox Code Playgroud)

WAV文件的音频由ffmpeg捕获并出现在out.mp3中

我真的不知道你的X设置是什么样的,但是如果你可以将音频转到pulseaudio,那么ffmpeg将捕获音频而不需要真正的声卡

原文答案:如果你想让音频进入Mac OS声卡

我最初到了这个页面,因为我试图从VM内部播放音频到Mac OS.但是如果你不关心从虚拟机中获取它,那么以下内容过于复杂.我把它留在这里虽然这个想法是为什么我最终来到这里

可以在VM内使用pulseaudio将WAV文件播放到物理声卡.我在Mac OS Sierra上使用docker 17.03.1-ce并使用brew来安装sox.这个设置还需要在VM上安装socat,但是具有更多脉冲知识(或者如果我有更多时间)的人应该能够删除这个部分,我认为

策略是使用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
Run Code Online (Sandbox Code Playgroud)

2. VM:更新并安装require软件包

    apt-get update
    apt-get install pulseaudio socat
    apt-get install alsa-utils
Run Code Online (Sandbox Code Playgroud)

我只为wav文件安装alsa-utils,所以你可以删除它

3. VM:启动pulseaudio服务器

    pulseaudio -D --exit-idle-time=-1
Run Code Online (Sandbox Code Playgroud)

这告诉服务器分叉到后台,而不是基于不活动退出

4. VM:为pulseaudio创建一个"接收器"

接收器是pulseaudio以特定格式发送音频数据的地方:

    pacmd load-module module-pipe-sink file=/dev/audio format=s16 rate=44100 channels=2
Run Code Online (Sandbox Code Playgroud)

这将以44100Hz的速率将音频发送到带符号的16位双通道文件/ dev/audio.

5. VM:将文件附加到网络

此文件现在需要"附加"到网络,socat用于在发布的地址创建一个侦听套接字(注意:此处没有身份验证),当Mac端​​连接时,该套接字已准备好发送音频

    socat file:/dev/audio tcp-listen:3000
Run Code Online (Sandbox Code Playgroud)

6. MAC:从网络读取数据到sox

在Mac端,我们现在需要连接到此端口并通过sox将详细信息发送到音频驱动程序:

    nc 127.0.0.1 3000 | sox -traw -r44100 -b16 -c2 -e signed-integer - -d
Run Code Online (Sandbox Code Playgroud)

默认情况下,mac使用netcat(nc),所以我在这里使用它连接到已发布的端口,然后将数据传递给sox,使用sox标志来匹配上面"load-module"语句中设置的值.

7. VM:玩!

最后,使用pulseaudio包中的paplay可以播放WAV文件:

    paplay /usr/share/sounds/alsa/Front_Center.wav
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

反向操作(即将VM音频发送到VM上的pulseaudio)也应该可以使用类似的,但是向后设置(模块管道源?)

我没有对ffmpeg页面上的命令进行测试,因为我没有X服务器.

  • 哇,多么惊人的答案。非常感谢。完美地工作。 (2认同)