14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DockerでPulseaudioを使って,ホストで音を出していてもコンテナで音を出せるようにする.

Posted at

背景

Dockerで音を鳴らそうとしたら以下のようなErrorが出た時のお話

ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Protocol error

Playback open error: -111,Connection refused
ALSA lib pcm_dmix.c:1052:(snd_pcm_dmix_open) unable to open slave
aplay: main:788: audio open error: Device or resource busy

ここではaplayを使って音を出そうとしてるよ

必要な知識

ALSA と PluseAudio の関係
歴史的な理由からか、Linux の音声入出力は PulseAudio と ALSA の二階建てになっている。ALSA は個々のサウンドカードを担当するのだが、一つのサウンドカードには一つのアプリしかアクセス出来ない。複数のアプリの音声入出力を調停するのは PulseAudio が担当している。具体的には、次のようになっている。

ALSA は色んなサウンドカードを統一的に操作出来るようにする仕組み。
アプリは直接 ALSA を操作しなくても良い。
あるアプリが ASLA 経由でサウンドカードを操作している間、他のアプリからそのサウンドカードを使えない。
とはいえ、直接 ALSA を使って音声入出力を行うアプリが存在する。
PluseAudio は複数のアプリが同時に同時にサウンドカードを使う仕組み。
お行儀の良いアプリは ALSA ではなく、PulseAudio 経由で音声入出力を行う。
とはいえ、直接 ASLA を使ってしまうアプリのために仮想サウンドカードの仕組みがある。
お行儀の良いアプリは PulseAudio 経由で音声入出力を行う事を期待しているが、ALSA を直接使ってしまうアプリのために PulseAudio は仮想サウンドカードとしても動作する。

ASLA から見ると、PulseAudio は default サウンドカードとして動作する。
アプリが default サウンドカードを通して再生を行うと、実際には PulseAudio がミキシングしてデフォルトのサウンドカードに音をだす。

https://qiita.com/propella/items/4699eda71cd742cba8d3

テストの仕方

コンテナ内で,

サンプルデータのダウンロード

$ wget http://freewavesamples.com/files/Kurzweil-K2000-Dual-Bass-C1.wav

https://qiita.com/propella/items/4699eda71cd742cba8d3

サンプルデータの再生

aplay Kurzweil-K2000-Dual-Bass-C1.wav

aplay -l とか aplay -L でサウンドデバイスを確認できるよ.
aplayapt install alsa-utilsで入れられるよ.
ただし,今回はno soundcards foundでおっけーだよ

Dockerfileの設定

apt install pulseaudioを入れておく.

DockerをRunするときの設定

準備

pulseaudio.socket ってファイルを生成する

ホスト側で

$ pacmd load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket

すると/tmpに生成される.

pulseaudio.client.conf ってファイルを作る

/tmppulseaudio.client.confって名前のファイルを作る
つまり下記の通り

$ touch /tmp/pulseaudio.client.conf

そのファイルをテキストエディタやらで開いて,下記を書き込む

default-server = unix:/tmp/pulseaudio.socket
# Prevent a server running in the container
autospawn = no
daemon-binary = /bin/true
# Prevent the use of shared memory
enable-shm = false

OptionsをつけてRunする

$ docker run --rm \
    --env PULSE_SERVER=unix:/tmp/pulseaudio.socket \
    --env PULSE_COOKIE=/tmp/pulseaudio.cookie \
    --volume /tmp/pulseaudio.socket:/tmp/pulseaudio.socket \
    --volume /tmp/pulseaudio.client.conf:/etc/pulse/client.conf \
    --user $(id -u):$(id -g) \
    imagename

結論

$ aplay Kurzweil-K2000-Dual-Bass-C1.wav 

してドゥーンってなれば成功です.

14
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?