在 docker 容器内运行 pulseaudio 以记录系统音频

Posted

技术标签:

【中文标题】在 docker 容器内运行 pulseaudio 以记录系统音频【英文标题】:Running pulseaudio inside docker container to record system audio 【发布时间】:2021-01-10 05:21:01 【问题描述】:

我正在尝试使用 Selenium 设置一个 Docker 容器,该容器使用 ffmpeg 记录带有系统音频的浏览器。我有使用 Xvfb 的视频工作。不幸的是,在音频方面,它似乎更棘手。

我想我会在容器内设置一个虚拟脉冲音频接收器,这样我就可以记录它的监视器:

pacmd load-module module-null-sink sink_name=loopback
pacmd set-default-sink loopback
ffmpeg -f pulse -i loopback.monitor test.wav

这适用于我的主机操作系统,但是当尝试在容器中启动 pulseaudio 守护程序时,它会失败并显示以下消息:

E: [pulseaudio] module-console-kit.c: Unable to contact D-Bus system bus: org.freedesktop.DBus.Error.FileNotFound: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory

这似乎与名为 dbus 的免费桌面服务有关。我已经尝试安装它并启动它的守护进程,但我似乎无法让它正常工作。 我找不到太多关于如何从这里开始的信息。我对pulseaudio缺少什么?也许有一种更简单的方法可以在容器内录制系统音频?

我的目标不是从主机操作系统录制它,而是在浏览器中播放音频并将其全部录制在同一个容器中。

【问题讨论】:

这听起来你需要比通常在 Docker 容器中运行更多的标准 Linux 桌面环境。运行普通桌面 Linux 设置的完整虚拟机(具有模拟显示和音频硬件)可能更适合此应用程序。 我也在做同样的事情。但是重新编码的视频在音频中有爆裂声。你也遇到过这个问题吗? @boygiandi 我也遇到了同样的问题,你找到解决办法了吗? @David 是的。这是因为 Xvfb 中的循环视频。每次循环时,它都会发出噼啪声。 @boygiandi 您实施的解决方案是什么?我可以查看任何参考/链接吗?另外我没有使用 xvfb 进行抓屏,仅使用默认设备进行音频录制 【参考方案1】:

here 的以下解决方案帮助了我。

在启动 PulseAudio 之前以 root 身份运行以下命令:

mkdir -p /var/run/dbus
dbus-uuidgen > /var/lib/dbus/machine-id
dbus-daemon --config-file=/usr/share/dbus-1/system.conf --print-address

【讨论】:

谢谢你,做到了。我还不得不从/etc/pulse/default.pa 中注释掉load-module module-console-kit,因为它导致E: [pulseaudio] module-console-kit.c: GetSessionsForUnixUser() call failed: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.ConsoleKit was not provided by any .service files,这可能是由于缺少consolekit 包。如果没有这个模块,pulseaudio 似乎可以正常工作。 一旦module-console-kit 被禁用,pulseaudio 甚至可以在没有 dbus 的情况下运行,尽管它确实会吐出很多(非致命)错误。

以上是关于在 docker 容器内运行 pulseaudio 以记录系统音频的主要内容,如果未能解决你的问题,请参考以下文章

在 docker 容器中录制本地音频

如何检查一个进程是不是在 docker 容器内运行?

如何在本地运行一次性 Docker 容器(从容器内触发)

从 docker 容器内运行 sbt 项目

如何为在 docker 容器内运行的 corda 节点运行迁移脚本?

在 Docker 容器内运行 Spring Boot 应用程序,无法连接 MySQL