web-dev-qa-db-ja.com

DockerコンテナからMacにオーディオを公開する方法は?

LinuxホストシステムでPulseAudioを使用することで可能であることは知っていますが、paprefsはMacではなくLinux用に構築されています。

15
benwiz

Docker-for-Mac VMにはサウンドパススルーデバイスがないため、その角度から利用できるものはありません。対照的に、virtualboxまたはvmwarefusion = VMにはパススルーオーディオを実行する機能があります。

次のコマンドを使用して、pulseaudioをインストールしてOSXで動作させることができました。

brew install pulseaudio

次のコマンドを実行することで、これが機能することを確認できました。スピーカーから音が聞こえます。

paplay cockatiel.wav

次のステップは、paplayのコピーを持つ画像を見つけることです。 jess/pulseaudio を見つけました。これはpulseaudioserverを意図しているようですが、使用できるはずです。 clientとしても。

Archlinux Wikiで、pulseaudioネットワークサウンドの設定について説明している次のガイドを見つけました: https://wiki.archlinux.org/index.php/PulseAudio/Examples#PulseAudio_over_network

次のようにすることで、この状況に適応させることができました。 Macで/usr/local/Cellar/pulseaudio/9.0/etc/Pulse/default.paを編集し、次の2行のコメントを外しました。

load-module module-esound-protocol-tcp
load-module module-native-protocol-tcp

Macでpaplay cockatiel.wavを再実行して、変更が引き続き機能することを確認しました。 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

これは、ローカルホームディレクトリをボリュームとしてコンテナを実行します。これには2つの目的があります。 1つ目は、私のcockatiel.wavが$HOME内にあるという事実です。 2つ目は、クライアントとサーバーの両方が同じ~/.config/Pulse/cookieファイルのコピーを持っている必要があるためです(そのarchlinux wikiガイドによる)。

Pulse_SERVER環境変数はOSXホストのen0IPアドレスであるため、paplayは何に接続するかを認識しています。

Paplayが同じ~/.config/Pulse/cookieファイルを見つけることができるように、HOME環境変数が必要です。

Docker-for-macで実行されているコンテナーからpulseaudioを介してサウンドを再生することができました。

~/.config/Pulse/cookieファイルが正しい場所に表示される限り、サウンドを再生できるはずです。これを実現するためにホストボリュームを使用する必要はありません。「dockercp」を実行することも、イメージにCOPYすることもできます。

16
programmerq

Macに PulseAudio をインストールします。

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
9
David Braun