Я знаю, что это возможно при использовании импульсного звука в хост-системе Linux. Но paprefs
создан для Linux, а не для Mac.
Как вывести звук из контейнера Docker на Mac?
Ответы (2)
Виртуальная машина Docker-for-Mac не имеет устройства передачи звука, поэтому с этой точки зрения вы не сможете воспользоваться преимуществами. Напротив, виртуальная машина Virtualbox или vmware fusion VM имеет возможность передавать аудио.
Мне удалось установить pulseaudio и работать с OSX с помощью следующей команды:
brew install pulseaudio
Я смог убедиться, что это работает, запустив следующее, услышав звук из моих динамиков:
paplay cockatiel.wav
Мой следующий шаг — найти изображение с копией paplay
. Я нашел jess/pulseaudio, который, похоже, предназначен для пульсаудио server, но я также смогу использовать его как клиент.
Я нашел следующее руководство на Archlinux Wiki, в котором обсуждается настройка сетевого звука pulseaudio: https://wiki.archlinux.org/index.php/PulseAudio/Examples#PulseAudio_over_network
Я смог адаптировать его к этой ситуации, выполнив следующие действия. Я отредактировал /usr/local/Cellar/pulseaudio/9.0/etc/pulse/default.pa
на своем Mac и раскомментировал следующие две строки:
load-module module-esound-protocol-tcp
load-module module-native-protocol-tcp
Я перезапустил paplay cockatiel.wav
на своем Mac, чтобы убедиться, что мои изменения все еще работают. демон pulseaudio, кажется, запускается по запросу и передает свои жалобы обратно в paplay
, чтобы они были напечатаны на моем экране, если я сделаю опечатку. У меня все еще есть звук с этими изменениями в default.pa, поэтому я доволен тем, что мои изменения ничего не сломали.
Затем я запустил клиент pulseaudio в таком контейнере:
docker run --rm -v $HOME:$HOME -w $HOME -it \
-e PULSE_SERVER=192.168.10.23 \
-e HOME=$HOME --entrypoint paplay \
jess/pulseaudio $HOME/cockatiel.wav
Что это делает, так это запускает контейнер с моим локальным домашним каталогом в качестве тома. Это служит двум целям. Во-первых, мой cockatiel.wav находится внутри $HOME
. Во-вторых, потому что и клиент, и сервер должны иметь копию одного и того же файла ~/.config/pulse/cookie
(согласно этому вики-руководству archlinux).
Переменная среды PULSE_SERVER
— это IP-адрес en0 моего хоста OSX, поэтому paplay знает, к чему подключаться.
Переменная окружения HOME
необходима, чтобы paplay мог найти тот же файл ~/.config/pulse/cookie
.
Мне удалось воспроизвести звук из контейнера, работающего на моем docker-for-mac, через pulseaudio.
Пока вы получаете файл ~/.config/pulse/cookie
, отображаемый в правильном месте, вы сможете воспроизводить звук. Для этого вам не нужно использовать хост-том — вы также можете сделать «docker cp» или даже COPY
в образ.
Установите PulseAudio на Mac:
brew install pulseaudio
Запустите демон:
pulseaudio --load=module-native-protocol-tcp --exit-idle-time=-1 --daemon
В вашем контейнере Docker:
- Установите PulseAudio, например,
apt-get install pulseaudio
. - установите следующую переменную среды:
ENV PULSE_SERVER=docker.for.mac.localhost
Когда вы запустите его, поделитесь своим каталогом ~/.config/pulse
с контейнером для аутентификации.
Вы можете запустить тест, чтобы увидеть, работает ли он следующим образом:
docker run -it -e PULSE_SERVER=docker.for.mac.localhost -v ~/.config/pulse:/home/pulseaudio/.config/pulse --entrypoint speaker-test --rm jess/pulseaudio -c 2 -l 1 -t wav
host.docker.internal
, и я бы рекомендовал изменить старый синтаксис -v
на более новый --mount type=bind,source=~/.config/pulse,target=/home/pulseaudio/.config/pulse
, чтобы избежать создания конфигурации на вашем хосте, принадлежащем как root
, если вы еще этого не сделали. запустите brew install pulseaudio
и настройте его и выдайте приятную ошибку о том, что он не существует, вместо того, чтобы сделать что-то плохое, но в остальном это выглядит потрясающе.
- person dragon788; 03.07.2020