Fit*_*tzi 2 pulse-audio ubuntu docker
我正在尝试在 Docker 容器内模拟无头 chrome 实例的麦克风输入。
基于在 Docker 容器内模拟 Chrome 的麦克风输入,我有以下设置:
Dockerfile
FROM buildkite/puppeteer:latest
RUN apt-get -qq update && apt-get install -y pulseaudio
COPY entrypoint.sh /opt/bin/entrypoint.sh
RUN useradd -ms /bin/bash bot
USER bot
ENTRYPOINT /opt/bin/entrypoint.sh
Run Code Online (Sandbox Code Playgroud)
entrypoint.sh
FROM buildkite/puppeteer:latest
RUN apt-get -qq update && apt-get install -y pulseaudio
COPY entrypoint.sh /opt/bin/entrypoint.sh
RUN useradd -ms /bin/bash bot
USER bot
ENTRYPOINT /opt/bin/entrypoint.sh
Run Code Online (Sandbox Code Playgroud)
运行容器时pulseaudio -D --verbose --exit-idle-time=-1失败,但没有更多详细信息:
E: [pulseaudio] main.c: Daemon startup failed.
Run Code Online (Sandbox Code Playgroud)
我可以排除pulseaudio在容器内自动启动的可能性,因为后续输出如下:
Connection failure: Connection refused
Connection failure: Connection refused
No PulseAudio daemon running, or not running as session daemon.
No PulseAudio daemon running, or not running as session daemon.
No PulseAudio daemon running, or not running as session daemon.
Run Code Online (Sandbox Code Playgroud)
并尝试pulseaudio -k结果E: [pulseaudio] main.c: Failed to kill daemon: No such process
由于没有错误,我很难找出问题所在,特别是因为我没有任何使用pulseaudio的经验。有谁知道可能出了什么问题或者为什么pulseaudio不会启动或给出任何错误?
目前正在 Ubuntu 16.04 桌面上进行测试。它应该能够在服务器上运行。
首先,非常感谢您的出发点,因为我希望通过以虚拟用户身份加入会议并播放音频来实现同样的目的。
Dockerfile我对您的和进行了以下更改,使其正常工作entrypoint.sh:
Dockerfile
FROM buildkite/puppeteer:latest
# Install pulse audio
RUN apt-get -qq update && apt-get install -y pulseaudio
# Use custom entrypoint
COPY entrypoint.sh /opt/bin/entrypoint.sh
# add root user to group for pulseaudio access
RUN adduser root pulse-access
# copy over node app and expose port or whatever you'd like to do else here (unrelated to pulseaudio)
# WORKDIR /opt/app
# COPY . /opt/app
ENTRYPOINT /opt/bin/entrypoint.sh
Run Code Online (Sandbox Code Playgroud)
entrypoint.sh
# Cleanup to be "stateless" on startup, otherwise pulseaudio daemon can't start
rm -rf /var/run/pulse /var/lib/pulse /root/.config/pulse
# Start pulseaudio as system wide daemon; for debugging it helps to start in non-daemon mode
pulseaudio -D --verbose --exit-idle-time=-1 --system --disallow-exit
# Create a virtual audio source; fixed by adding source master and format
echo "Creating virtual audio source: ";
pactl load-module module-virtual-source master=auto_null.monitor format=s16le source_name=VirtualMic
# Set VirtualMic as default input source;
echo "Setting default source: ";
pactl set-default-source VirtualMic
# whatever you'd like to do next
# e.g. npm run start
Run Code Online (Sandbox Code Playgroud)
此后,音频重新路由工作正常,容器内的浏览器将虚拟麦克风识别为默认输入。
有兴趣的更多信息:
首先,免责声明,我在任何方面都不是脉冲音频专家,这都是在试错模式中发现的,可能不是最佳解决方案。
至于容器启动/重启后pulseaudio守护进程无法启动的问题,你必须清理所有pulseaudio目录,让守护进程“无状态”启动。奇怪的是,每次我构建容器时它都启动得很好,但随后每次启动时它都会死掉。所以这是我的解决方案,因为我不依赖来自pulseaudio的任何持久数据。
启动守护进程pulseaudio已经默认了一个auto-null以监视器为源的空接收器,所以我将其映射到虚拟源VirtualMic。让它工作的关键是将监视器添加为虚拟源的主控,否则 puppeteer 浏览器在访问设备时会抛出媒体错误。之后,它工作正常,并且在泊坞窗内播放的音频作为虚拟麦克风通过浏览器传输。
不要忘记将您的容器用户添加到组中pulse-access,否则您将再次收到相同的媒体错误。当我在容器内以 root 用户运行时,我添加RUN adduser root pulse-access到了Dockerfile.
至于 tcp 部分,我的用例不需要它。
我在容器内调试时发现的事情:
pacmd在容器内没有以任何方式工作,没有进一步调查,因为pactl工作正常pactl命令以获取信息调试输出希望这也能帮助其他试图完成相同或类似任务的人。
| 归档时间: |
|
| 查看次数: |
5072 次 |
| 最近记录: |