Аудио Pipewire в контейнере Fedora
Начиная с Fedora 34, pulseaudio был заменен pipewire. Я использовал гнездо pulseaudio для получения звука из контейнеров, что было наиболее безопасным способом. Итак, я хотел бы теперь настроить pipewire для обработки звука в контейнере, но я не могу найти способ ...
Я сейчас пробую самый простой способ, разделяя snd-устройство без сокета:
Запустить контейнер Fedora 34:
podman run -it --device /dev/snd fedora
Создайте пользователя и добавьте его в аудиогруппу:
useradd usertest -u 1000 -m -p ''
usermod -aG audio usertest
Установить пакеты:
dnf -y install pipewire alsa-utils pulseaudio-utils
systemctl start --user pipewire-pulse.service
Когда я запускаю его, возникает ошибка DBUS, потому что DBUS не работает в контейнере
И с пользователем, 'pactl info' возвращает эту ошибку:
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
Или можно было бы получить что-то похожее на сокет pulseaudio с pipewire?
1 ответ
Я думаю, вам не обязательно запускать полноценный Pipewire-сервер в контейнере, вам просто нужно его установить. Он содержит клиентские библиотеки, которые вам понадобятся. Если на вашем хосте уже работает сервер Pipewire, нам просто нужно подключиться к нему из контейнера.
Мне нужно было именно то, что вы хотели (запустить программное обеспечение внутри контейнера, которое сможет воспроизводить звук через звуковую карту хоста), и вот как я это сделал - /questions/10076764/zapuskat-prilozheniya-s-ispolzovaniem-audio-v-dok-kontejnere/65874317#65874317
Несколько небольших отличий в вашей настройке:
- я использовал
docker
, нетpodman
- для моего теста я использовал
alpine
образ докера, не тот
Я попробовал это сfedora
docker-образ — и все работало отлично:
- обязательно передайте файл сокета Pipewire с вашего хоста в ваш контейнер. В докере это делается так
-v /run/user/1000/pipewire-0:/tmp/pipewire-0
- обязательно установите переменную XDG_RUNTIME_DIR внутри контейнера, чтобы она указывала на место, где вы смонтировали файл сокета Pipewire (
-e XDG_RUNTIME_DIR=/tmp
) - внутри контейнера для установки Pipewire (который является одновременно клиентом и сервером, но мы собираемся использовать только клиентскую его часть) и Pipewire-alsa, который представляет виртуальное устройство ALSA, для программного обеспечения только для ALSA.
docker run -it -v /run/user/1000/pipewire-0:/tmp/pipewire-0 -e XDG_RUNTIME_DIR=/tmp --rm fedora /bin/sh
yum install pipewire pipewire-alsa alsa-utils
speaker-test
# you should hear a sound here
Единственное, что мне не нравится, это то, что в Fedorapipewire
package содержит множество жестких зависимостей. С Alpine этого не произошло. Вероятно, существует другой способ - установить клиентскую часть Pipewire только в Fedora, не создавая всего этого беспорядка, но все же.