【问题标题】:Record Sound on Ubuntu Docker Image在 Ubuntu Docker 映像上录制声音
【发布时间】:2017-09-04 21:29:40
【问题描述】:

当我capture my screen 时,我想用ffmpeg 录制音频。我在使用alsa 时遇到的错误是我的图像没有声卡-f alsa -ac 2 -i hw:0

这是在新版本的 Ubuntu 上重现的方法

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

docker pull ubuntu
docker run -it --rm ubuntu

设置 alsa(高级 Linux 声音架构)

apt-get update
apt-get install alsa-utils

列出声卡

aplay -l
# aplay: device_list:268: no soundcards found...

并且播放这个声音会失败,因为这个图像没有任何声卡

sudo aplay /usr/share/sounds/alsa/Front_Center.wav

【问题讨论】:

  • 您在什么操作系统上运行 docker,Linux、Windows 还是 Mac?
  • 嗨 @BMitch 我正在运行 Mac,但我将在 Linux 上运行生产

标签: ubuntu audio docker ffmpeg


【解决方案1】:

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

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

here 中提取。如果这对您不起作用,则在此链接上还有更多选项。看看吧!

【讨论】:

  • 嗨@OscarAkaElvis。我尝试了这个命令,但看起来 --lxc-conf 在 2014 年被删除。我尝试了其他建议的键来替换 lxc-conf。但是 id 看起来他们中的任何一个都不起作用。有什么建议吗?
  • 也许你需要容器​​内的 dbus 和 shm。尝试在 docker run 命令中添加-v /run/dbus/:/run/dbus/ -v /dev/shm:/dev/shm
  • 嗨 @OscarAkaElvis 我想让你知道我为这个问题开始了 50 美元的赏金,bountysource.com/issues/…
【解决方案2】:

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

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

【讨论】:

  • 感谢背景@BMitch。我不需要在我的扬声器上播放音频,而只是保存在视频中。我还需要做这个声卡映射吗?
  • 我没有关注 linux 声音设备的开发(ALSA 似乎是当前版本的 /dev/snd)。但是,麦克风和扬声器往往是一起处理的,因此如果您希望 Mac 中的麦克风可以在容器内访问,您需要将其传递给 VM,然后再传递给容器,这非常重要考虑到所涉及的不同操作系统的任务。
  • 嗨 @BMitch 我想让你知道我为这个问题开始了 50 美元的赏金,bountysource.com/issues/…
【解决方案3】:

编辑:在阅读 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 服务器。

【讨论】:

  • 哇,真是一个了不起的答案。非常感谢。完美运行。
  • 什么会导致“E:[pulseaudio] main.c:守护进程启动失败。”启动 pulseaudio 守护进程时出错?
【解决方案4】:
sudo adduser $USER audio

usermod --append --groups audio $USER

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

另外,我使用这些命令安装了必要的 alsa 和脉冲音频。

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

sudo apt install pulseaudio pulseaudio-utils

【讨论】:

    猜你喜欢
    • 2021-06-28
    • 2019-03-22
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多