如何在Docker容器内访问Mac OS X的麦克风?

10

我正在运行一个 Docker 容器,其中包含使用 MacBook Pro 内置麦克风录制几秒钟声音的 Python 代码。

我的挑战之一是确定如何在 Docker 容器内提供访问/共享 MacBook Pro 麦克风。大多数现有的关于此问题的答案都针对基于 Linux 的发行版,但我在 macOS 上没有找到类似的解决方案。

操作系统版本详细信息:

System Version: macOS 10.14.2 (18C54)
Kernel Version: Darwin 18.2.0

Docker:

Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false

这段 Python 代码简单易懂,能够在主机上按预期工作。

import sounddevice as sd
import numpy as np
fs = 48000
duration=5
rec = sd.rec(int(duration * fs), samplerate=fs, channels=1, blocking=True)
print(rec)

这是docker文件:

FROM python:3

RUN apt-get -y update
RUN apt-get -y install libasound-dev
RUN apt-get -y install portaudio19-dev

WORKDIR /usr/src/app
COPY requirements.txt ./
COPY AudioRecordingTest.py ./
RUN pip install -r requirements.txt
CMD [ "python", "./AudioRecordingTest.py" ]

docker build -t audiorecording:1.0 .

docker run -it --rm --device --privileged=true DONT_KNOW_ABOUT_THIS_PART:/dev/snd  audiorecording:1.0 

理想情况下,应该能够像Linux主机一样挂载/共享麦克风。如果不能,还有其他可能的解决方案吗?
docker run -it --rm --device --privileged=true DONT_KNOW_ABOUT_THIS_PART:/dev/snd  audiorecording:1.0 
1个回答

1
尝试在主机上运行 pulseaudio 服务器,并从 docker 连接到它。
您需要使用 pulseaudio 支持构建 docker:
RUN apt-get update && apt-get install -y \
    vorbis-tools \
    sox \
    alsa-utils \
    libasound2 \
    libasound2-plugins \
    pulseaudio \
    pulseaudio-utils \
    --no-install-recommends \
    && rm -rf /var/lib/apt/lists/* 

然后

  1. /etc/pulse/default.pa中添加load-module module-native-protocol-tcp
  2. 使用-e将其地址作为环境变量暴露给docker
  3. 通过将cookie复制到docker中(或使用-v选项共享)授权其在docker中使用
  4. 使用--device添加对主机设备的访问权限

然后运行

docker run -it \
           --device=/dev/snd \   
           -e PULSE_SERVER=host.docker.internal \
           -v ~/.config/pulse:/home/pulseaudio/.config/pulse \
  ... + other options you need

另请参见this, thisthis


我怎样才能获取~/.config/pulse文件夹?我已经使用Homebrew安装了“pulseaudio”,但该目录并不存在。 - Chompakorn CChaichot
你不仅需要安装pulseaudio服务器,还需要运行它 ;) 你可以通过brew services start pulseaudio(然后重新登录)或者pulseaudio --load=module-native-protocol-tcp --exit-idle-time=-1 --daemon来启动它。在服务器启动后,配置目录会自动创建。 - igrinis
请注意,最新的 Docker 将 docker.for.mac.localhost 更改为 host.docker.internal - igrinis
当我尝试运行 pulseaudio --load=module-native-protocol-tcp --exit-idle-time=-1 --daemon 时,我遇到了一些问题。我通过homebrew下载了pulseaudio并按照您的指示运行,但出现了错误: dyld: Library not loaded: /usr/local/opt/gdbm/lib/libgdbm.6.dylib Referenced from: /usr/local/bin/pulseaudio Reason: image not found [1] 13266 abort pulseaudio - Chompakorn CChaichot
1
更新一下,我已经在另一台电脑上尝试了您的方法。Pulseaudio似乎运行良好。但是,在添加设备时运行docker run命令失败,出现以下错误:docker: Error response from daemon: error gathering device information while adding custom device "/dev/snd": no such file or directory. - Chompakorn CChaichot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接