Как вывести звук из контейнера Docker на Mac?

Я знаю, что это возможно при использовании импульсного звука в хост-системе Linux. Но paprefs создан для Linux, а не для Mac.


person benwiz    schedule 19.10.2016    source источник


Ответы (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 в образ.

person programmerq    schedule 19.10.2016
comment
Я получаю следующую ошибку при запуске paplay piano2.wav $ paplay piano2.wav W: [] caps.c: Обычно все дополнительные возможности теперь удаляются, но это невозможно, поскольку PulseAudio был построен без поддержки возможностей. Ошибка соединения: соединение отклонено pa_context_connect() не удалось: соединение отклонено - person valentin_nasta; 23.12.2016
comment
@valentin_nasta вам удалось решить проблему с установкой PulseAudio на Mac? - person Paul Sturgess; 29.01.2017
comment
С текущим PulseAudio 10.0 запуск pulseaudio --daemonize=false -v, похоже, не запускается, получите W: [] socket-util.c: Ошибка IP_TOS: неверный аргумент после добавления двух модулей-esound-protocol-tcp/module -native-protocol-tcp строки. - person jamshid; 20.06.2017

Установите PulseAudio на Mac:

brew install pulseaudio

Запустите демон:

pulseaudio --load=module-native-protocol-tcp --exit-idle-time=-1 --daemon

В вашем контейнере Docker:

  1. Установите PulseAudio, например, apt-get install pulseaudio.
  2. установите следующую переменную среды: 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
person David Braun    schedule 20.06.2018
comment
Оказывается, в настройках специальных возможностей OS X было установлено стерео -> моно. Стерео работает нормально. Спасибо! - person John C.; 19.05.2020
comment
В недавнем выпуске Docker для Mac (и Windows) они изменили волшебное имя хоста на host.docker.internal, и я бы рекомендовал изменить старый синтаксис -v на более новый --mount type=bind,source=~/.config/pulse,target=/home/pulseaudio/.config/pulse, чтобы избежать создания конфигурации на вашем хосте, принадлежащем как root, если вы еще этого не сделали. запустите brew install pulseaudio и настройте его и выдайте приятную ошибку о том, что он не существует, вместо того, чтобы сделать что-то плохое, но в остальном это выглядит потрясающе. - person dragon788; 03.07.2020
comment
Спасибо за это. Мне потребовалось некоторое время, чтобы понять, почему тест работал, а мой собственный контейнер — нет: монтирование (-v ~/.config/pulse:/home/pulseaudio/.config/pulse) указывает на домашнюю каталог для пользователя pulseaudio, который создается образом jess/pulseaudio. Мне пришлось изменить монтирование, чтобы указать на домашний каталог моего пользователя. - person David Nelson; 09.08.2020
comment
@dragon788 пытается использовать ваше предложение для монтирования, выдает ошибку (говорит, что нужны абсолютные пути). Мне удалось заставить его работать, как ни странно, тест динамика не дает никакого вывода - person fllprbt; 20.03.2021