Воспроизведение звука через pulseaudio на удалённой машине

Актуально на январь 2021, pulseaudio 14.2

Дано
В локалке имеется машина к которой подключены колонки, через которые с помощью pulseaudio (далее PA) по сети хочется воспроизводить звуки с других машин. Машина-колонка может быть в любом состоянии: с залогинеными пользователями, без пользователей или в headless-режиме.

С удивлением обнаружил отсутствие актуальных полноценных описаний процесса, поэтому пришлось разбираться самому...

Настройка сервера
Т.к. на машине-колонке (сервере) залогиненного пользователя может не быть, нужно запустить PA в общесистемном режиме. Дальнейшие манипуляции происходят на этой машине.

Создаём пользователя pulse (под ним будет работать PA, иначе не запустится) и добавляем его в группу audio (для доступа к alsa):
# useradd -r -u 130 -s /usr/bin/nologin pulse
# usermod -d /var/lib/pulse -aG audio pulse
Uid 130 зарезервирован в арче за PA.
Создаём группу pulse-access (нужна для PA, ругается в логах):
# groupadd -g 131 pulse-access
Gid 131 из той же таблицы.

Проверяем шипение через alsa:
$ sudo -u pulse speaker-test -c 2
Если звука нет, то смотрим alsamixer (от юзера pulse), настраиваем порядок звуковых карт, разбираемся с опциями модулей ядра (см. документацию по alsa)...

Создаём системный сервис для PA /etc/systemd/system/pulseaudio.service (найдено на просторах интернета, опции запуска могут быть избыточными):
[Unit]
Description=Pulseaudio sound server
After=avahi-daemon.service network.target

[Service]
Type=forking
ExecStart=/usr/bin/pulseaudio --realtime --no-cpu-limit --system --disallow-exit --daemon
ExecReload=/bin/pkill pulseaudio

[Install]
WantedBy=multi-user.target
Включаем, запускаем. Если настройка выполняется на самом сервере, то может потребоваться прибитие пользовательского экземпляра PA и запрет автозапуска оного. Я всё делал удалённо.

Запускаем pulsemixer (от юзера pulse!) или другую крутилку ручек для PA и настраиваем громкости.
Окончательно убеждаемся, что общесистемный PA работает:
$ sudo -u pulse paplay /usr/share/sounds/alsa/Front_Right.wav

Настраиваем сетевой доступ к PA и анонс по mDNS (опционально, потребуется avahi и pulseaudio-zeroconf). Дописываем в /etc/pulse/system.pa разрешённые для подключения ip адреса:
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;xx.xx.xx.xx
load-module module-zeroconf-publish
Можно без адресов, но тогда надо заморочиться кукесами, см. документацию по PA.

Перезапускаем PA. Сервер готов.

Настройка клиента
На заинтересованных в удалённом воспроизведении машинах добавляем в /etc/pulse/default.pa (это если PA там запускается в пользовательском режиме, а если тоже в системном, то в system.pa):
load-module module-zeroconf-discover
Тут тоже нужен avahi и pulseaudio-zeroconf.

Есть вариант без mDNS/zeroconf. В default.pa на клиентских машинах пишем что-то вроде:
load-module module-tunnel-sink-new sink-name=SINK_NAME server=SERVER
Подробнее в соответствующей документации.

На машине-клиенте выставляем в качестве вывода наш сервер (через любой микшер): называется как-то так: bla-bla-bla on pulse@host. Всё.

В некоторых случаях "bla-bla-bla" в названии может быть весьма унылым, например: "Family 17h (Models 10h-1fh) HD Audio Controller Analog Stereo".
Переименуем выход. На клиентской машине выполним:
$ pacmd list-sinks | grep name:
	name: <alsa_output.pci-0000_00_1f.3.analog-stereo>
	name: <tunnel.host.local.alsa_output.pci-0000_38_00.6.analog-stereo>
Видим, что в данном случае имеем два синка локальный и удалённый (начинается с "tunnel").

На сервере добавим в /etc/pulse/system.pa:
update-sink-proplist alsa_output.pci-0000_38_00.6.analog-stereo device.description="QQQ"
После перезапуска PA получаем заданное имя.

Настройка роутера
Ну а теперь представим, что в локалке есть wifi-роутер и мы хотим, чтобы устройства с его беспроводной (да и проводной тоже) сети тоже могли транслировать звук. Проблема в том, что автообнаружение через mDNS работает только до гейта (коим в wifi-сети является роутер). Чтобы пробросить mDNS через роутер опять пригодится avahi. Ставим avahi на роутере (на нём у вас OpenWRT прошито, не так ли? ;))) ) В /etc/avahi-daemon.conf раскомментируем/исправляем:
enable-reflector=yes
Перезапускаем avahi.

Итого
Работают даже достаточно вычурные сценарии: телефон подключённый через блютуз к ноутбуку, который подлючён через роутер к локалке, играет на колонках на сервере. Единственно, попытка подключить на лету (на ноуте играла музыка) вызвала падение PA на ноуте, но после перезапуска PA и переподключения телефона всё заработало. Параллельно воспроизводится звук с телефона и ноута.

Неравнодушные читатели надоумили запустить на ноуте по вайфаю видео и транслировать звук опять же по вайфаю на сервер, намекая на чрезмерное использование пропускной способности беспроводной сети. Запускалось 1080@30 видео с ютюба, роутер TP-Link TL-WR842N. Не сразу, но заработало. Пришлось попереключать туда-сюда выходы. А спустя какое-то время работало даже переключение "на лету". Не сказать, что идеально, но работает. Ноут в беспроводной сети был один, эфир почти свободен. Ясно, что в более сложных условиях этот сценарий может и не заработать.

Ошибки и т.п.
Иногда при старте воспроизведения звук заикается на 0.5 - 2 сек. Попытка закомментировать модуль засыпания
#load-module module-suspend-on-idle
к изменениям не привела. Эффект имеется на ноуте подключенном через wifi. При воспроизведении со стационарного компьютера через гигабитный провод заикания отсутствуют.

Попытка вывести разные приложения на разные выходы (плеер на сервер, а браузер на колонки ноута) привела к жёстким заиканиям на сервере каждые 2 секунды. Пользоваться такой конфигурацией практически невозможно. Нагрузки на процессор нет. В логах сервера:
ALSA woke us up to write new data to the device, but there was actually nothing to write.
Most likely this is a bug in the ALSA driver 'snd_hda_intel'. Please report this issue to the ALSA developers.
We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail.
Возможно, это из-за использования мной pulseeffects.
такие дела.
А когда то mpd хватало :)
vs220
А когда то mpd хватало :)
Ждал это коммента ;)

mpd хватало тем, кто воспроизводил только музыку и только через mpd. А жизнь, как показало последнее время, гораздо богаче таких нишевых занятий.
такие дела.
А если не секрет для чего используется?
vs220, ну поскольку только что настроил, то пока для музыки ;)
А вообще для всякой лабораторной мультимедиа деятельности. Презентации со звуком, групповое участие в дистанционных семинарах и т.п.
Раз есть муз.центр с хорошими колонками, то чего не воспользоваться.
такие дела.
Эххх. Заморачивался этим лет, наверное, восемь назад.
Пробовал видео смотреть? Как там дела с задержками сейчас?
Lupus pilum mutat, non mentem.
Особенно по wifi
Lupus pilum mutat, non mentem.
jim945
Пробовал видео смотреть? Как там дела с задержками сейчас?
да как бы даже iptv по вайфаю 8 лет назад прекрасно работало. никаких проблем.

думаю, задержки пульсы как-то связаны со стартом соединения... в общем надо выяснять. да и так в общем не слишком напрягает.
такие дела.
Автор без обид, но написанного на wiki хватает за глаза, а про роутер и пользователей это какая-то отсебятина... (пользуюсь не один год, если что)
При подключении лучше использовать какой-нибудь скриптик который дёрнет pulse на клиенте, а то не удобно пользоваться.
p.s. качество сильно зависит от загрузки сети даже на честных 300mbit.
Вот если бы кто-нибудь написал как это кодирнуть во что-нибудь вменяемое, а потом на сервере принять, цены бы ему не было...
Ошибки в тексте-неповторимый стиль автора©
cucullus
да как бы даже iptv по вайфаю 8 лет назад прекрасно работало. никаких проблем.
Причём здесь iptv?
Я имел ввиду запустить фильм.
По поводу было всё нормально. Но с WiFi постоянные проблемы с рандомной задержкой, обрывами и прочим прелестями.
И, как выше заметили, просто забивает почти весь канал.

С тех пор у меня всё проще. Во все колонки встроил Bluetooth приёмники :)
Lupus pilum mutat, non mentem.
 
Зарегистрироваться или войдите чтобы оставить сообщение.