Qual è il modo migliore per sincronizzare un evento su più processi?

4

Immagina di avere due processi OS distinti (il sistema operativo attuale non è importante). Il processo A è responsabile della riproduzione di un file video. Il processo B è responsabile della riproduzione dell'audio che accompagna il file video. Entrambi i processi sono client, collegati tramite una rete locale ad un server.

Supponendo che i flussi audio e video siano sincronizzati a livello di file, quali meccanismi utilizzerei per garantire che entrambi i processi si coordinino con il server per garantire assolutamente che, una volta istruiti, inizino e continuino a suonare in sincrono?

Questo sembra un problema comune, ma sto cercando di trovare soluzioni pratiche e dettagliate.

    
posta acron 13.01.2015 - 10:20
fonte

4 risposte

5

Secondo Raccomandazione EBU R37 :

“The relative timing of the sound and vision components of a television signal” states that end-to-end audio/video sync should be within +40ms and -60ms (audio before / after video, respectively) and that each stage should be within +5ms and -15ms.

Questa citazione è il riassunto dalla sincronizzazione audio alla sincronizzazione video . sup>

Questo suggerisce che hai bisogno di precisione temporale misurata in 10 secondi millisecondi.

Suggerimento di Karl Bielefeldt di Precision Time Protocol è stato buono, ma mi sembra eccessivo. PTP ha una seconda accuratezza micro (su una LAN locale), quindi è 3 ordini di grandezza (più di 1000 volte) più accurati del necessario e di conseguenza molto più difficili da implementare.

Il Network Time Protocol (NTP) molto più vecchio e più ampiamente disponibile dovrebbe comportare la sincronizzazione degli orologi entro un millisecondo su una LAN, che è un ordine di grandezza (più di 10 volte) più preciso di quello che richiediamo. Anche se il tuo server e client fossero su Internet, dovresti essere in grado di sincronizzare gli orologi su 10 di ms se non hai problemi con percorsi asimmetrici e congestione della rete.

Il software client / server NTP è standard nella maggior parte dei sistemi operativi, tutto ciò che devi fare è sincronizzare entrambi i client sullo stesso server. Si noti che anche se entrambi i client sono sincronizzati individualmente sul server con una precisione di più / meno 1 ms, l'uno rispetto all'altro sono sincronizzati solo con più / meno 2 ms (uno potrebbe essere 1ms avanti rispetto al server mentre l'altro è 1ms dietro ), ma questo è ancora ben all'interno della soglia della percezione.

Una volta sincronizzati i tempi del sistema, i client riempiono il buffer iniziale e informano il server del primo periodo in cui potrebbero garantire l'avvio per la pubblicazione di tale contenuto. Una volta che il server ha ricevuto entrambe le volte, invierebbe il tempo di caso peggiore a entrambi i client e entrambi dovrebbero avviarsi in quel momento.

Infine, poiché gli orologi possono andare alla deriva nel tempo, i tuoi client e server dovrebbero mantenere la sincronizzazione degli orologi, e se il video si allontana troppo dall'audio, dovresti duplicare o saltare i fotogrammi del video per mantenere la sincronizzazione. Questo dovrebbe essere necessario solo se stai utilizzando flussi molto lunghi.

Per inciso, il motivo per la regolazione del video piuttosto che dell'audio è che è molto meno probabile notare un 1 frame dup / skip nei video (supponendo 20 fps o superiore) rispetto a un 1/60 di un secondo problema audio.

    
risposta data 14.01.2015 - 20:06
fonte
2

Di solito, questo genere di cose viene risolto utilizzando un collegamento di trasporto con specifiche temporali rigorose, come HDMI. Per una rete TCP / IP, ci sono sistemi come JACK che ti fanno parte del modo in cui ci sono per l'audio, ma io ' Non sono a conoscenza di una soluzione audio / video sincronizzata.

Essenzialmente, hai bisogno di un clock sincronizzato molto accurato, usando qualcosa come Precision Time Protocol , quindi nei tuoi pacchetti, tu specificare con precisione a che ora riprodurre ogni frame / campione. Quindi è necessaria una pianificazione in tempo reale per assicurarsi che le scadenze vengano rispettate e un buffer sufficiente a coprire la latenza della rete. Molto più facile a dirsi che a farsi.

Questo è il modo difficile. Il modo più semplice è fare il massimo sforzo, quindi dare ai controlli dell'utente la possibilità di regolare manualmente il ritardo.

    
risposta data 13.01.2015 - 18:29
fonte
0

Che dire se il server invia ogni blocco del flusso ai client contemporaneamente e non invia il blocco successivo fino a quando entrambi i client hanno riconosciuto di aver completato la riproduzione del blocco precedente? Probabilmente dovrai giocare con qualche tipo di buffer di blocchi nel client, ma non dovrebbe essere difficile. In questo modo, il server è l'unica fonte di posizione di gioco e tutto sarà sincronizzato sui limiti dei blocchi. La dimensione del blocco sarà probabilmente determinata dalla larghezza di banda della tua rete (e probabilmente dal tuo dispositivo sorgente).

    
risposta data 13.01.2015 - 17:35
fonte
0

Il mio pensiero è che non c'è modo di garantire questo tipo di evento a livello di processo. Non puoi sapere quale priorità verrà assegnata alla ricezione di un determinato evento, l'ordine del prossimo evento rilevante ecc.

A me sembra che sia necessaria una terza applicazione di marshalling il cui compito è ricevere gli eventi, accodare la risorsa bufferizzata e sincronizzare la riproduzione localmente. Pertanto, l'unica responsabilità dell'applicazione è quella di ricevere i dati di rete separati e quindi distribuire i dati contemporaneamente alle risorse periferiche locali singolarmente.

Come menzionato da @TMN, avrai assolutamente bisogno di una sorta di buffering perché le modifiche alla rete possono essere imprevedibili, e nei media sincronizzati anche un solo millisecondo potrebbe rendere le cose strane.

    
risposta data 13.01.2015 - 18:18
fonte

Leggi altre domande sui tag