2010-05-08 19 views
37

Sono in fase di avvio della progettazione di un sistema audio client/server in grado di eseguire lo streaming audio arbitrariamente su una rete. Un server centrale pompa un flusso audio e il numero x di client riceve i dati audio e li riproduce. Finora non è stata necessaria alcuna magia e ho persino avuto modo di lavorare su questo scenario con VLC media player pronto all'uso.sincronizzazione audio su una rete

Tuttavia, la parte difficile sembra sincronizzare la riproduzione audio in modo che tutti i client siano in sincronia udibile (la latenza effettiva può essere consentita purché sia ​​percepita come sincronizzata da un ascoltatore umano).

La mia domanda è se c'è qualche metodo o algoritmo noto da utilizzare per questo tipo di problema di sincronizzazione (il video è probabilmente risolto allo stesso modo). I miei pensieri iniziali sono incentrati sulla sincronizzazione degli orologi tra le macchine fisiche e quindi sulla creazione di un "timer principale" virtuale e in qualche modo sull'allineamento dei pacchetti di dati audio contro di esso.

Alcuni prodotti già la soluzione del problema (non però ancora sufficiente per il mio caso d'uso complessiva):

http://www.sonos.com

http://netchorus.com/

Tutti gli indicatori sono i benvenuti. Grazie.

PS: This related question sembra essere morto molto tempo fa.

+0

in sincronia con cosa? Intendi dejittering o sincronizzazione di canali diversi o sincronizzazione con video o ...? – KillianDS

+8

@KillianDS: sincronizzati in modo che due client riproducano esattamente lo stesso audio come se fossero due altoparlanti collegati allo stesso sistema audio. – sharkin

+0

ehi Sai come usare p4sync in Android? – Kaushal28

risposta

28

Ryan Barrett ha scritto le sue scoperte su his blog.

La sua soluzione coinvolto utilizzando NTP come un metodo per mantenere tutti gli orologi-sync:

Scherzi a parte, però, c'è solo un trucco per p4sync, ed è così che si utilizza NTP. Un host funge da server p4sync . Gli altri client p4sync sincronizzano i loro orologi di sistema sull'orologio del server utilizzando SNTP. Quando il server avvia la riproduzione di un brano, lo registra l'ora, al millisecondo. I clienti poi recuperano che timestamp, calcolare la differenza tra l'ora corrente da quella timestamp, e cercare in avanti che lontano nella canzone.

+2

+2 se potessi, questo tipo di materiale è esattamente quello che sto cercando, grazie! – sharkin

+0

come aggiungere questa libreria menzionata in Android? – Kaushal28

0

"... purché venga percepito come sincronizzato da un ascoltatore umano" - Molto difficile da fare perché l'orecchio è meno indulgente dell'occhio. Soprattutto se vuoi farlo su una rete wireless.

Vorrei sperimentare prima con tecnologie basate sul Web, lettori audio flash telecomandati da un server tramite Javascript.

Se questo ha dato risultati negativi, proverei a ottenere più controllo usando qualcosa come python (con pygame).

Se sono stati fatti progressi, proverei anche a utilizzare ChucK e provare alcune programmazioni di basso livello con la libreria audio ALSA.

Se non soddisfacente viene fuori mi sarebbe venuto e rivisitare questo post e in realtà leggere qualcosa di sensato da un esperto guru di programmazione audio e, se la mia vita dipendesse da questo, probabilmente finirà per sborsare i 14 libbre di inglese per l'applicazione commerciale NetChorus o qualcosa di simile.

+0

Grazie per la risposta.Come accennato, sembra che i prodotti esistenti risolvano il problema in modo soddisfacente, tuttavia non sono in grado di ricoprire altre parti del mio particolare caso d'uso. – sharkin

+0

Sono curioso, cosa stai pianificando? – zaf

9

Problema difficile, ma possibile.

Utilizzare NTP o tictoc per ottenere un clock sincronizzato con una velocità nota in termini di origine del tempo del sistema.

Inoltre, mantenere uno stimatore in funzione della velocità del proprio orologio sonoro; il solito modo di farlo è registrare con lo stesso dispositivo audio che sta suonando, registrando su un buffer precaricato con un numero magico e vedere dove si trova la scheda audio in un tempo misurato dall'orologio sincronizzato (o viceversa, vedere quanto tempo ci vuole per fare un numero noto di campioni sull'orologio sincronizzato). È necessario continuare a farlo, l'orologio si sposta rispetto al tempo di rete.

Così ora si sa esattamente quanti campioni al secondo dall'orologio della scheda audio è necessario emettere per abbinare il tasso dell'orologio sincronizzato. Quindi, quindi, interpolate i campioni ricevuti dalla rete a quella velocità, più o meno una correzione se è necessario recuperare o diminuire un po 'da dove si è arrivati ​​sull'ultimo buffer. Dovrai essere estremamente attento a fare questa interpolazione in modo tale da non introdurre artefatti audio; c'è il codice di esempio here per gli algoritmi di cui avrete bisogno, ma ci vorrà un bel po 'di lettura prima di iniziare a farlo.

Se la sorgente è una registrazione dal vivo, ovviamente, dovrai misurare la frequenza di campionamento di tale scheda audio e interpolarla in campioni di tempo di rete prima di inviarla.

9

Controlla il documento An Internet Protocol Sound System di Tom Blank di Microsoft Research. Risolve il problema esatto su cui stai lavorando. La sua soluzione prevede la sincronizzazione degli orologi tra le macchine e l'uso di timestamp per consentire a ciascuno di suonare contemporaneamente. Lo svantaggio di questo approccio è la latenza. Per ottenere tutti gli orologi sincronizzati è necessario stampare l'ora alla massima latenza sulla rete.

6

A seconda delle dimensioni e la forma della sede, ottenendo tutto per essere in sincronia è la parte più facile, sempre di tutto per suono corretto sia una forma d'arte in sé, se possibile a tutti. Dal punto di vista tecnico, la parte più difficile è scoprire il ritardo dalla timeline sincronizzata all'effettiva uscita audio. L'hardware identico e il framework software a bassa latenza (ASIO, JACK) ci aiutano sicuramente, così come la calibrazione. In anticipo o attivo. Altrimenti si tratta solo di sincronizzare la timeline con NTP e di utilizzare un feedback a loop chiuso sul pitch audio per sincronizzare l'output con la timeline concordata.

Il problema più grande è che il suono richiede molto tempo per propagarsi. 10 m di differenza di distanza sono già 30ms di ritardo, sufficienti a rovinare la localizzazione del suono. Raddoppia e si entra nel fastidioso territorio dell'eco. Le impostazioni audio professionali in realtà introducono intenzionalmente ritardi, utilizzano un numero maggiore di tweeter e giocano con riverberi per evitare una cacofonia di echi che porta fuori l'ascoltatore.

+0

Se si riesce a sincronizzare continuamente i diversi computer, l'introduzione di tale ritardo (e quindi il ritardo degli altoparlanti collegati) sarebbe banale. – puk

+0

L'introduzione del ritardo è davvero banale, capire quale debba essere il ritardo è difficile se la posizione di ascolto non è fissa. –

+0

Sì, sono d'accordo, se si tratta di un punto fisso, è possibile testare valori diversi. Ma se è una persona in movimento, o più persone, forse è meglio non provarci nemmeno – puk