Аудио 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образ докера, не тот

Я попробовал это сfedoradocker-образ — и все работало отлично:

  1. обязательно передайте файл сокета Pipewire с вашего хоста в ваш контейнер. В докере это делается так-v /run/user/1000/pipewire-0:/tmp/pipewire-0
  2. обязательно установите переменную XDG_RUNTIME_DIR внутри контейнера, чтобы она указывала на место, где вы смонтировали файл сокета Pipewire (-e XDG_RUNTIME_DIR=/tmp)
  3. внутри контейнера для установки 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

Единственное, что мне не нравится, это то, что в Fedorapipewirepackage содержит множество жестких зависимостей. С Alpine этого не произошло. Вероятно, существует другой способ - установить клиентскую часть Pipewire только в Fedora, не создавая всего этого беспорядка, но все же.

Другие вопросы по тегам