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

时间:2019-02-15 03:08:26

标签: python docker audio microphone

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

我面临的挑战之一是确定如何在Docker容器中提供访问/共享Macbook Pro麦克风的功能。关于堆栈溢出或其他地方的大多数现有问题都为基于Linux的发行版提供了解决方案,但我对Mac OS所做的事情没有太多运气。

操作系统版本详细信息:

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 个答案:

答案 0 :(得分: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. load-module module-native-protocol-tcp添加到/etc/pulse/default.pa
  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

另请参见thisthisthis