Я хочу играть звук на Ubuntu 16.04 на использовании Докера PulseAudio и ALSA. Однако это производит ошибку Device or resource busy
. Я думаю, что это вызвано тем, что устройство по умолчанию ALSA не установлено на сервер звука PulseAudio (Примечание: это установлено на PulseAudio на хосте Ubuntu). Как я могу изменить устройство по умолчанию на него? Например, могу я делать так путем создания ~/.asoundrc
или путем изменения /etc/pulse/client.conf
?
$ # On the host Ubuntu...
$ aplay -L | head -n9
default
Playback/recording through the PulseAudio sound server
null
Discard all samples (playback) or generate zero samples (capture)
pulse
PulseAudio Sound Server
sysdefault:CARD=PCH
HDA Intel PCH, ALC295 Analog
Default Audio Device
$ aplay /usr/share/sounds/alsa/Front_Center.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
$ paplay /usr/share/sounds/alsa/Front_Center.wav # Success
$ # On the Docker container...
$ sudo docker run -it --device /dev/snd ubuntu:16.04 /bin/bash
root@81af4bf99890:/# apt update
root@81af4bf99890:/# apt install alsa-base alsa-utils pulseaudio
root@81af4bf99890:/# aplay -L | head -n10
null
Discard all samples (playback) or generate zero samples (capture)
pulse
PulseAudio Sound Server
default:CARD=PCH
HDA Intel PCH, ALC295 Analog
Default Audio Device
sysdefault:CARD=PCH
HDA Intel PCH, ALC295 Analog
Default Audio Device
root@81af4bf99890:/# aplay /usr/share/sounds/alsa/Front_Center.wav
ALSA lib pcm_dmix.c:1029:(snd_pcm_dmix_open) unable to open slave
aplay: main:722: audio open error: Device or resource busy
root@81af4bf99890:/# paplay /usr/share/sounds/alsa/Front_Center.wav
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
На моей среде изображения Jess's не работают, также. Вот журнал в качестве примера.
$ # When I play some sounds on host, `jess/spotify` fails to play music.
$ sudo docker run -it \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY \
--device /dev/snd \
--name spotify \
jess/spotify
Gtk-Message: Failed to load module "canberra-gtk-module"
libGL error: MESA-LOADER: failed to retrieve device information
libGL error: Version 4 or later of flush extension not found
libGL error: failed to load driver: i915
libGL error: failed to open drm device: No such file or directory
libGL error: failed to load driver: i965
[1115/043835.051841:ERROR:sandbox_linux.cc(344)] InitializeSandbox() called with multiple threads in process gpu-process.
[1115/043840.945653:ERROR:web_plugin_impl.cc(38)] Widevine registration is not supported after context initialization
(spotify:1): GLib-GIO-CRITICAL **: g_dbus_connection_send_message: assertion 'G_IS_DBUS_CONNECTION (connection)' failed
ALSA lib pcm_dmix.c:1052:(snd_pcm_dmix_open) unable to open slave
Последняя строка говорит, что существует ошибка, связанная с ALSA. (Отметьте это jess/spotify
может играть музыку, когда нет никакого другого программного обеспечения, которое играет звук. Это может быть то, потому что звуковое устройство не занято в таком случае.)
Благодаря этому комментарию fsmunoz я могу играть звуки на контейнере с помощью pulseaudio, не изменяя файлов конфигурации. Точки следующие:
PULSE_SERVER
чтобы позволить pulseaudio контейнера знать адрес сервера.audio
группа.И вот рабочий пример:
$ sudo docker run -it \
--device /dev/snd \
-e PULSE_SERVER=unix:${XDG_RUNTIME_DIR}/pulse/native \
-v ${XDG_RUNTIME_DIR}/pulse/native:${XDG_RUNTIME_DIR}/pulse/native \
-v ~/.config/pulse/cookie:/root/.config/pulse/cookie \
--group-add $(getent group audio | cut -d: -f3) \
ubuntu:16.04 /bin/bash
root@9c9f7e0db4e3:/# apt update
root@9c9f7e0db4e3:/# apt install alsa-base alsa-utils pulseaudio
root@eed016c1fb61:/# aplay -L | head -n9
default
Playback/recording through the PulseAudio sound server
null
Discard all samples (playback) or generate zero samples (capture)
pulse
PulseAudio Sound Server
sysdefault:CARD=PCH
HDA Intel PCH, ALC295 Analog
Default Audio Device
root@9c9f7e0db4e3:/# aplay /usr/share/sounds/alsa/Front_Center.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
root@9c9f7e0db4e3:/# paplay /usr/share/sounds/alsa/Front_Center.wav # Success!
Примечание: Однако, я не знаю, почему cookie необходим. Без cookie, ошибки ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Access denied
произошедший.