如何访问docker容器内的mac os x麦克风?

Raz*_*azi 9 python audio microphone docker

我正在运行一个带有 python 代码的 docker 容器,该代码使用内置麦克风的主机 MacBook Pro 记录几秒钟的声音。

我面临的部分挑战是确定如何在 Docker 容器内提供访问/共享 Macbook Pro 麦克风。大多数关于堆栈溢出或其他地方的现有问题都为基于 Linux 的发行版提供了解决方案,但我没有太多运气在 mac os 上做同样的事情。

操作系统版本详情:

System Version: macOS 10.14.2 (18C54)
Kernel Version: Darwin 18.2.0
Run Code Online (Sandbox Code Playgroud)

码头工人:

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

这是 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" ]
Run Code Online (Sandbox Code Playgroud)
docker build -t audiorecording:1.0 .

docker run -it --rm --device --privileged=true DONT_KNOW_ABOUT_THIS_PART:/dev/snd  audiorecording:1.0 
Run Code Online (Sandbox Code Playgroud)

理想情况下,当 Linux 是主机时,应该能够像您一样安装/共享麦克风。如果不是,其他可能的解决方案是什么?

docker run -it --rm --device --privileged=true DONT_KNOW_ABOUT_THIS_PART:/dev/snd  audiorecording:1.0 
Run Code Online (Sandbox Code Playgroud)

igr*_*nis 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/* 
Run Code Online (Sandbox Code Playgroud)

然后

  1. 添加load-module module-native-protocol-tcp/etc/pulse/default.pa
  2. 将其地址作为环境变量公开给 docker-e
  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
Run Code Online (Sandbox Code Playgroud)

另请参见这个这个这个