Jak skonfigurować zlew PulseAudio?

16

Próbuję skonfigurować zlew PulseAudio na moim Raspberry Pi, aby przesyłać strumieniowo wszystkie dźwięki systemowe z mojego komputera. Jak najlepiej to zrobić?

Na przykład, czy można oglądać filmy, czy opóźnienie jest zbyt duże? Próbowałem tego jakiś czas temu przy użyciu gstreamer, ale z opóźnieniem około 2 sekund, co jest bezużyteczne dla moich wymagań.

zaraz
źródło
1
Dostaję sekundę lub dwie opóźnienia.
złotowłosa

Odpowiedzi:

19

Te oficjalne instrukcje dotyczące tworzenia „bezpośrednie połączenie” na sieć z nadzieją po prostu pracować dla większości ludzi, ale wydaje PulseAudio i nie dogadać tak dobrze: zajęło mi godzin . [Oprócz „bezpośredniego połączenia” możesz również użyć metody „tunelowej” opisanej w dalszej części, ale najpierw zalecamy przeczytanie tego.]

Mam teraz pulpit (fedora 17) przesyłający strumieniowo dźwięk do pi. Zminimalizowałem /etc/pulsepliki konfiguracyjne po obu stronach. Po stronie pulpitu:

/etc/pulse/client.conf

# See man pulse-client.conf
default-server = tcp:192.168.2.13:4713

Adres LAN mojej pi z domyślnym portem pulseaudio. Ale oto coś, co sprawiło, że pomyliłem się przez chwilę - przy określonym serwerze pulseaudio nawet się nie uruchomi:

> pulseaudio --start
N: [pulseaudio] main.c: User-configured server at tcp:192.168.2.13:4713, refusing to start/autospawn.

Będzie działał na pierwszym planie (prawdopodobnie dlatego, że nie odczytuje wtedy puls-client.conf?). Jak się jednak okazuje, wcale nie trzeba go uruchamiać po stronie pulpitu (wysyłania) , co nie zostało zapisane w dokumentach pulseaudio. Korzystanie z lsof -i -Pniego wydaje się, że działają wtyczki niższego poziomu dla różnych odtwarzaczy multimedialnych.

Tak więc ten wiersz „client.conf” to właściwie wszystko, czego potrzebujesz po stronie komputera / klienta, jeśli wszystko, co zamierzasz zrobić, to korzystać z sieci (ale patrz „Jeszcze więcej komplikacji” poniżej).

Chociaż demon pulseaudio (po stronie odbierającej / serwera) może być uruchamiany jako usługa systemowa, twórcy pulsu odradzają go , aw rzeczywistości na pi skrypt skryptowy inicjuje tylko ostrzeżenie: wciąż musisz uruchomić samemu. Fedora nie zawiera nawet wpisu usługi rozruchu systemowego.

Dlatego po stronie pi powinieneś jawnie uruchomić i zatrzymać proces serwera pulseaudio, tak skonfigurowany:

/etc/pulse/daemon.conf

# See man pulse-daemon.conf
log-level = info
exit-idle-time = 10800 # 3 hours

Możesz użyć -1, exit-idle-timeaby utrzymać działanie demona przez czas nieokreślony. Uważaj, to sekunda, a domyślnie 20 (co oznacza, że ​​„tajemniczo” umiera, jeśli tego nie ustawisz).

/etc/pulse/default.pa

# See man default.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.2.0/24
load-module module-alsa-sink device=hw:0,0

Ponieważ jest to aplikacja sieciowa, uruchamianie jej jako root nie jest dobrym pomysłem. Jednak, jak wspomniano powyżej man pulseaudio, dobrym pomysłem jest również „powtórzenie” procesu, aby nadać mu wyższy priorytet. Możesz to zrobić ręcznie za pomocą nice, ale pulseaudio zrobi to automatycznie dla roota lub członków pulse-rtgrupy, jeśli plik wykonywalny jest „setuid”, co oznacza, że ​​może korzystać z niektórych uprawnień roota, a następnie przejść do właściwego nieuprzywilejowanego identyfikatora użytkownika ( pingi passwdteż to zrobić). Więc (jako root lub sudo):

chmod u+s /usr/bin/pulseaudio

Nie ma pulse-rtgrupy utworzonej, gdy pulseaudio jest zainstalowany na Raspbian, więc:

groupadd pulse-rt

To da ci gid jak 1003. Dodaj (np.) Użytkownika pi do tej grupy:

usermod -aG pulse-rt pi

Ale na Raspbian nadal nie będziesz mógł się odświeżyć jak pi. W tym celu dodaj do /etc/security/limits.conf:

@pulse-rt       hard nice -20
@pulse-rt       soft nice -20

Musisz faktycznie zalogować się przed wprowadzeniem tych zmian; jeśli używasz ssh z pi, po prostu użyj login. Teraz możesz uruchomić pulseaudio, a ono zrestartuje się -11, co jest prawdopodobnie wyższym priorytetem niż większość innych procesów (spójrz na wartość NICE w top).

Podczas odtwarzania dźwięku przesyłanego strumieniowo z sieci pulseaudio na pi zużywa około 10% procesora i trywialną ilość pamięci. :) To i mój pulpit są w przewodowej sieci LAN; strumienie impulsów surowe dane pcm (wierzę), więc wykorzystanie przepustowości odpowiada częstotliwości próbkowania źródła, 1 kB / s i więcej. Niestety, podczas oglądania wideo zauważalne jest opóźnienie w dźwięku.

Jeszcze więcej komplikacji ...

Niestety żadna z różnych aplikacji dźwiękowych z mojego komputera nie działała od razu; mpg123w ogóle by nie działał. W tym celu w Fedorze potrzebujesz mpg123-plugins-pulseaudiopakietu. Do flashowania w przeglądarce (np. Youtude) potrzebujesz alsa-plugins-pulseaudio(to właśnie łączy się ze zdalnym serwerem). Inne dystrybucje powinny mieć podobne pakiety. Jeśli korzystałeś wcześniej z pulseaudio (nie byłem), być może już je zainstalowałeś.

Dzwonki i gwizdki pulpitu KDE również nie działały. Jest to trudniejszy problem do rozwiązania, ponieważ szuka lokalnego serwera pulseaudio, a zgodnie z opisem, użycie bezpośredniego połączenia oznacza, że ​​żaden serwer nie może być uruchomiony lokalnie. Można to zrobić za pomocą metody „tunelowej”.

moduł-zlew-tunel

Jest to inny sposób wspomniany w dokumentach pulseaudio. W takim przypadku masz serwer działający po obu stronach i jedną rękę do drugiej. Aby to zrobić, skomentuj „serwer domyślny” /etc/client.confi dodaj lokalny /etc/default.pazawierający:

load-module module-tunnel-sink sink_name=rpi_tunnel server=tcp:192.168.2.13:4713 sink=bcm1

Jeśli nie włożysz sink_name, pulseaudio nie uruchomi się. sinkOdnosi się do nazwy zlewozmywaka z boku pi, która następnie musi także nazwę; dodać odpowiedni sink_namedo module-alsa-sinklinii default.patam:

load-module module-alsa-sink device=hw:0,0 sink_name=bcm1 

Uruchom serwer po obu stronach i ... presto. Podczas gdy wszystko, łącznie z sygnałami dźwiękowymi KDE, było teraz przenoszone, odtwarzanie w przeglądarce flash mocno się zacięło. Jednak w innym środowisku pulpitu (właściwie tylko menedżer okien, fvwm) było w porządku.

Lubię KDE, ale mogę żyć bez sygnałów dźwiękowych, więc na razie pozostanę przy bezpośrednim połączeniu.

Rozwiązywanie problemów

Jeśli masz problemy, korzystanie pulseaudio -vvvv --log-level=debugz pi zapewnia wiele komunikatów do debugowania. Początkowo, gdy nie mogłem uzyskać dźwięku na pi, zgłosił problem „związany z błędem w sterowniku ALSA bcm2835”, który wydawał mi się dziwny, ponieważ dźwięk był w porządku tylko z alsa, i jestem pewien, że istnieje oprogramowanie pi, które zależy na pulseaudio - apt-get remove pulseaudioa ponowna instalacja apt-get install pulseaudiowydawała się to naprawić ... Nie jest to rozwiązanie, które lubię widzieć, ale hej, przynajmniej teraz mogę słuchać tish bez konieczności podłączania głośników do każdego urządzenia. Przeważnie.

złotogłowych
źródło
Dzięki za obszerną odpowiedź. Jedno pytanie: co dzieje się z dźwiękiem prosto z Pi?
Vincent
Nie wiem, czy kiedykolwiek tego spróbowałem (już tego nie robię), ale pulseaudio ma być multiplekserem, więc powinno działać.
Złotowłosa