synchronizacja dźwięku przez sieć

Rozpoczynam projektowanie systemu audio klienta / serwera, który może dowolnie przesyłać dźwięk przez sieć. Jeden centralny serwer wypompowuje strumień audio, a x liczba klientów odbiera dane audio i odtwarza je. Do tej pory magia nie jest potrzebna, a ja nawet mam ten scenariusz do pracy z VLC media player po wyjęciu z pudełka.

Jednak najtrudniejszą częścią wydaje się synchronizacja odtwarzania dźwięku, tak aby wszyscy klienci byli w synchronizacji słyszalnej (rzeczywiste opóźnienie może być dozwolone tak długo, jak jest postrzegane jako zsynchronizowane przez ludzkiego słuchacza).

Moje pytanie brzmi czy jest jakaś znana metoda lub algorytm do wykorzystania w tego typu problemach synchronizacji (wideo jest prawdopodobnie rozwiązany w ten sam sposób). Moje pierwsze myśli skupiają się wokół synchronizacji zegarów między fizycznymi maszynami, a tym samym stworzenia wirtualnego "głównego timera" i jakoś wyrównania pakietów danych audio do niego.

Niektóre produkty już rozwiązują problem (jednak nadal nie wystarcza dla mojej ogólnej "use-case"): {]}

Http://www.sonos.com

Http://netchorus.com/

Wszelkie wskazówki są mile widziane. Dzięki.

PS: to związane z tym pytanie wydaje się umrzeć dawno temu.

Author: Community, 2010-05-08

5 answers

Ryan Barrett napisał swoje odkrycia na swoim blogu.

Jego rozwiązanie polegało na użyciu NTP jako metody utrzymywania synchronizacji wszystkich zegarów:

Poważnie, choć jest tylko jeden trick do p4sync, i tak to używa NTP. Jeden host działa jako p4sync serwer. Pozostali klienci p4sync synchronizują swoje zegary systemowe z zegar serwera, przy użyciu SNTP. Kiedy serwer zaczyna grać piosenkę, to zapisuje czas, do milisekundy. Klienci więc Odzyskaj to. timestamp, Oblicz różnicę pomiędzy aktualnym czasem od tego timestamp, i szukać do przodu, że daleko do piosenki.

 28
Author: Kevin Panko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-08 18:47:26

Trudny problem, ale możliwy.

Użyj NTP lub tictoc Aby uzyskać zsynchronizowany zegar ze znaną szybkością pod względem źródła czasu systemu.

Zachowaj również Estymator działający co do szybkości zegara dźwiękowego; zwykle robi to nagrywanie za pomocą tego samego urządzenia dźwiękowego, które jest odtwarzane, nagrywanie przez bufor wstępnie załadowany magiczną liczbą i zobacz, gdzie karta dźwiękowa dociera do mierzonego czasu przez zsynchronizowany zegar (lub odwrotnie, zobacz, jak długo karta dźwiękowa jest odtwarzana). wymaga wykonania znanej liczby próbek na zegarze zsynchronizowanym). Musisz to robić, zegar będzie dryfował w stosunku do czasu sieciowego.

Więc teraz wiesz dokładnie, ile próbek na sekundę przez zegar karty dźwiękowej trzeba wypuścić, aby dopasować częstotliwość zegara zsynchronizowanego. Więc następnie interpolujesz próbki otrzymane z sieci w tym tempie, plus lub minus korekta, jeśli chcesz nadrobić lub wycofać się trochę z miejsca, w którym dotarłeś do ostatniego bufora. Będziesz trzeba być bardzo ostrożnym z wykonywaniem tej interpolacji w taki sposób, aby nie wprowadzała artefaktów audio; jest tu przykładowy kod dla algorytmów, których będziesz potrzebował, ale zanim się do tego przyzwyczaisz, trzeba będzie trochę poczytać.

Jeśli źródłem jest nagranie na żywo, oczywiście, będziesz musiał zmierzyć częstotliwość próbkowania tej karty dźwiękowej i interpolować do próbek czasu sieciowego przed wysłaniem go.

 9
Author: Andrew McGregor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-09 00:27:05

Zobacz artykuł Internet Protocol Sound System autorstwa Toma Blanka z Microsoft Research. Rozwiązuje dokładnie problem, nad którym pracujesz. Jego rozwiązanie polega na synchronizacji zegarów między maszynami i użyciu znaczników czasu, aby pozwolić im grać w tym samym czasie. Minusem tego podejścia jest opóźnienie. Aby uzyskać wszystkie zegary zsynchronizowane wymaga stemplowania czasu z największym opóźnieniem w sieci.

 9
Author: Steve Rowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-09 20:36:13

W zależności od wielkości i kształtu miejsca, uzyskanie synchronizacji wszystkiego do be jest łatwą częścią, uzyskanie wszystkiego do dźwięku poprawnego jest formą sztuki samą w sobie, jeśli to w ogóle możliwe. Od strony technicznej najtrudniejszą częścią jest znalezienie opóźnienia od zsynchronizowanej osi czasu do rzeczywistego wyjścia dźwięku. Posiadanie identycznego sprzętu i oprogramowania o niskim opóźnieniu (ASIO, JACK) z pewnością pomaga tutaj, podobnie jak kalibracja. Albo z wyprzedzeniem, albo aktywne. Inaczej to po prostu synchronizacja osi czasu z NTP i za pomocą sprzężenia zwrotnego w pętli zamkniętej do wysokości dźwięku, aby zsynchronizować wyjście do uzgodnionej osi czasu.

Większy problem polega na tym, że propagacja dźwięku zajmuje znaczną ilość czasu. 10m różnicy odległości to już 30ms opóźnienia-wystarczy, aby zepsuć lokalizację dźwięku. Podwój to I dostaniesz się na irytujące terytorium echo. Profesjonalne konfiguracje audio faktycznie celowo wprowadzają opóźnienia, wykorzystują większą liczbę głośników wysokotonowych i graj z pogłosami, aby uniknąć kakofonii ECHA, która zużywa słuchacza.

 6
Author: Ants Aasma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-16 22:21:23

" ... tak długo, jak jest postrzegane jako zsynchronizowane przez ludzkiego słuchacza " - bardzo trudne do zrobienia, ponieważ ucho jest mniej wybaczające niż oko. Zwłaszcza jeśli chcesz to zrobić przez sieć bezprzewodową.

Najpierw eksperymentowałbym z technologiami internetowymi, odtwarzaczami Flash audio zdalnie sterowanymi przez serwer poprzez Javascript.

Jeśli to dało złe wyniki, To starałbym się uzyskać większą kontrolę, używając czegoś takiego jak python (z pygame).

Gdyby poczyniono postępy, zrobiłbym spróbuj również użyć ChucK i wypróbuj programowanie niskopoziomowe za pomocą biblioteki audio ALSA.

Jeśli nie wyjdzie nic satysfakcjonującego, wpadłbym ponownie do tego postu i rzeczywiście przeczytał coś sensownego przez eksperta Guru programowania audio i, jeśli moje źródło utrzymania zależało od tego, prawdopodobnie skończyłoby się rozwidleniem 14 funtów angielskich na komercyjną aplikację NetChorus lub coś podobnego.

 0
Author: zaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-25 20:04:39