synchronisation audio sur un réseau

Je suis au démarrage de la conception d'un système audio client/serveur qui peut diffuser de l'audio arbitrairement sur un réseau. Un serveur central pompe un flux audio et un nombre x de clients reçoit les données audio et les lit. Jusqu'à présent, aucune magie n'est nécessaire et j'ai même obtenu ce scénario pour travailler avec VLC media player hors de la boîte.

Cependant, la partie délicate semble être la synchronisation de la lecture audio afin que tous les clients soient en synchronisation audible (la latence réelle peut être autorisée tant qu'elle l'est perçu comme étant synchronisé par un auditeur humain).

Ma question Est s'il y a une méthode ou un algorithme connu à utiliser pour ce type de problème de synchronisation (la vidéo est probablement résolue de la même manière). Mes propres pensées initiales se concentrent sur la synchronisation des horloges entre les machines physiques et créent ainsi une "minuterie principale" virtuelle et alignent en quelque sorte les paquets de données audio contre elle.

Certains produits résolvent déjà le problème (mais toujours pas suffisant pour mon ensemble cas d'utilisation):

Http://www.sonos.com

Http://netchorus.com/

Tous les pointeurs sont les bienvenus. Grâce.

PS: Cette question connexe semble avoir disparu depuis longtemps.

38
demandé sur Community 2010-05-08 21:44:29

5 réponses

Ryan Barrett a écrit ses conclusions sur son blog .

Sa solution consistait à utiliser NTP {[2] } comme méthode pour synchroniser toutes les horloges:

Sérieusement, il n'y en a qu'un trick à p4sync, et c'est comme ça utilise le protocole NTP. Un hôte agit comme le p4sync serveur. Les autres clients p4sync synchroniser leurs horloges système à la horloge du serveur, en utilisant SNTP. Lorsque l' serveur commence à jouer une chanson, il enregistre le temps, à la milliseconde près. Client puis les récupérer horodatage, calculer la différence entre l'heure actuelle de cela horodatage, et chercher en avant que loin dans la chanson.

28
répondu Kevin Panko 2010-05-08 18:47:26

Problème Difficile, mais possible.

Utilisez NTP ou tictoc pour obtenir une horloge synchronisée avec un taux connu en termes de source de temps de votre système.

Gardez également un estimateur en cours d'exécution quant à la fréquence de votre horloge sonore; la façon habituelle de le faire est d'enregistrer avec le même périphérique sonore qui joue, en enregistrant sur un tampon préchargé avec un nombre magique, et de voir où la carte son arrive dans un temps mesuré par l'horloge synchronisée (ou vice versa, voir il faut faire un nombre connu d'échantillons sur l'horloge synchronisée). Vous devez continuer à faire cela, l'horloge va dériver par rapport à l'heure du réseau.

Maintenant, vous savez exactement combien d'échantillons par seconde par l'horloge de votre carte son vous devez produire pour correspondre à la cadence de l'horloge synchronisée. Donc, vous interpolez ensuite les échantillons reçus du réseau à ce rythme, plus ou moins une correction si vous avez besoin de rattraper ou de reculer un peu d'où vous êtes arrivé sur le dernier tampon. Vous il faut faire extrêmement attention à faire cette interpolation de telle sorte qu'elle n'introduise pas d'artefacts audio; il y a un exemple de code ici pour les algorithmes dont vous aurez besoin, mais ça va être un peu de lecture avant de vous mettre au courant.

Si votre source est un enregistrement en direct, bien sûr, vous devrez mesurer la fréquence d'échantillonnage de cette carte son et interpoler dans des échantillons de temps réseau avant de l'envoyer.

9
répondu Andrew McGregor 2010-05-09 00:27:05

Consultez le papier un système audio de protocole Internet par Tom Blank de Microsoft Research. Il résout le problème exact sur lequel vous travaillez. Sa solution consiste à synchroniser les horloges sur les machines et à utiliser des horodatages pour les laisser jouer en même temps. L'inconvénient de cette approche est la latence. Pour obtenir toutes les horloges synchronisées nécessite l'estampage de l'heure à la plus grande latence sur le réseau.

9
répondu Steve Rowe 2010-05-09 20:36:13

En fonction de la taille et de la forme du lieu, il est facile de synchroniser tout ce qui est be, Tout ce qui est sound correct est une forme d'art en soi, si possible. Du côté technique, la partie la plus difficile est de trouver le délai entre votre timeline synchronisée et la sortie sonore réelle. Avoir un matériel identique et un cadre logiciel à faible latence (ASIO, JACK) aide certainement ici, tout comme l'étalonnage. Soit à l'avance ou active. Autrement il s'agit simplement de synchroniser la timeline avec NTP et d'utiliser un retour en boucle fermée sur la hauteur audio pour synchroniser la sortie sur la timeline convenue.

Le plus gros problème est que le son prend beaucoup de temps à se propager. 10m de différence de distance est déjà 30ms de retard-assez pour bousiller la localisation du son. Doublez cela et vous entrez dans le territoire d'écho ennuyeux. Les configurations audio professionnelles introduisent délibérément des retards, utilisent un plus grand nombre de tweeters et jouez avec les réverbérations pour éviter une cacophonie d'échos qui use l'auditeur.

6
répondu Ants Aasma 2011-06-16 22:21:23

"... tant qu'il est perçu comme synchronisé par un auditeur humain " - très difficile à faire parce que l'oreille est moins indulgente que l'œil. Surtout si vous voulez le faire sur un réseau sans fil.

J'expérimenterais d'abord avec des technologies basées sur le web, des lecteurs audio flash Télécommandés par un serveur via Javascript.

Si cela donnait de mauvais résultats, j'essaierais d'obtenir plus de contrôle en utilisant quelque chose comme python (avec pygame).

Si des progrès étaient réalisés, je le ferais essayez également d'utiliser ChucK et essayez une programmation de bas niveau avec la bibliothèque audio ALSA.

Si rien de satisfaisant ne sort, je viendrais revoir ce post et lisais en fait quelque chose de sensé par un gourou de la programmation audio expert et, si mon gagne-pain en dépendait, finirait probablement par fourcher les 14 livres anglaises pour l'application commerciale NetChorus ou quelque chose de similaire.

0
répondu zaf 2011-07-25 20:04:39