在Ubuntu Docker图像上录制声音

在Ubuntu Docker图像上录制声音,ubuntu,audio,docker,ffmpeg,Ubuntu,Audio,Docker,Ffmpeg,我想要录制音频时使用ffmpeg。使用alsa时出现的错误是,我的图像没有声卡-f alsa-ac 2-I hw:0 以下是如何在Ubuntu的新版本上复制 在新的ubuntu docker映像中启动会话 docker pull ubuntu docker run -it --rm ubuntu 安装alsa(高级Linux声音体系结构) 列出声卡 aplay -l # aplay: device_list:268: no soundcards found... sudo aplay /us

我想要录制音频时使用
ffmpeg
。使用
alsa
时出现的错误是,我的图像没有声卡
-f alsa-ac 2-I hw:0

以下是如何在Ubuntu的新版本上复制

在新的ubuntu docker映像中启动会话

docker pull ubuntu
docker run -it --rm ubuntu
安装alsa(高级Linux声音体系结构)

列出声卡

aplay -l
# aplay: device_list:268: no soundcards found...
sudo aplay /usr/share/sounds/alsa/Front_Center.wav
播放此声音将失败,因为此图像没有任何声卡

aplay -l
# aplay: device_list:268: no soundcards found...
sudo aplay /usr/share/sounds/alsa/Front_Center.wav

我认为关键在于docker运行命令将设备映射到容器中。试试这个:

docker run -ti --rm \
    -v /dev/snd:/dev/snd \
    --lxc-conf='lxc.cgroup.devices.allow = c 116:* rwm' \
    myContainer sh -c "echo run something"`

摘自。在这个链接上有更多的选择,如果这不适合你。看看

这将比你希望的困难得多。由于Docker在嵌入式VM中运行,因此需要首先将声卡映射到VM。映射到VM后,您将能够执行
docker运行--device=/dev/snd:/dev/snd…
将设备从VM映射到容器中


问题是第一部分,特别是因为Mac和Linux是不同的操作系统。似乎需要安装一些工具来创建所需的跨平台/开发设备。完成此操作后,您需要配置虚拟机以将这些设备共享到虚拟机中。

编辑:在阅读了BMitch关于无需播放到本地计算机的第一条评论后

    pulseaudio -D --exit-idle-time=-1
我建议使用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中使用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创建一个“接收器”

接收器是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,以匹配上面“load module”语句中设置的值

7。VM:玩吧

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

    paplay /usr/share/sounds/alsa/Front_Center.wav
8。麦克:听着 在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
使用类似的反向设置(模块管道源?)

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

sudo adduser $USER audio

这两个命令都帮助我在linux中显示声卡(具体来说是ubuntu)。我在docker容器中也遇到了同样的错误,在使用docker exec解决问题时,我将这些错误添加到自动脚本中,并且我能够使用arecord-l和aplay-l命令显示Souncard

此外,我使用这些命令来安装必要的alsa和pulse audio

sudo apt-get install alsa alsa-utils alsa-tools

sudo apt install pulseaudio pulseaudio-utils


你在什么操作系统上运行docker、Linux、Windows或Mac?嗨@BMitch我在运行Mac,但我将在productionHi@OscarAkaElvis的Linux上运行。我尝试了这个命令,但它看起来像是在2014年被删除的
--lxc conf
。我尝试了其他建议的键来替换
lxc conf
。但我觉得他们好像都不管用。有什么建议吗?也许你需要容器内的dbus和shm。尝试将
-v/run/dbus/:/run/dbus/-v/dev/shm:/dev/shm
添加到docker run commandHi@OscarAkaElvis,我想让你知道我为此问题开始了50美元的悬赏。感谢@BMitch的背景。我不需要在我的扬声器上播放音频,而只需要保存在视频中。我还需要做这个声卡映射吗?我还没有关注linux声音设备的开发(ALSA似乎是这样的)