Wir entschuldigen uns für die Länge dieser Antwort - es handelt sich um mehrere Wochen Test-und-Fehler-Forschung. Ich fürchte, die Details könnten von Bedeutung sein, deshalb habe ich mehr als weniger bereitgestellt. Es konzentriert sich auf Audio-Sharing
Wie andere in diesem Thread war ich daran interessiert, Audio mit Räumen zu synchronisieren, in denen sich die akustischen Umgebungen überschneiden. Da sich der Ton mit einer Geschwindigkeit von etwa einem Fuß / Millisekunde bewegt, ist eine Synchronisation mit einer Geschwindigkeit von etwa 10 Millisekunden erforderlich. Ich habe eine Möglichkeit gefunden, diese Funktion mit VLC zu nutzen und sie stundenlang synchron zu halten, ohne zu wandern. Ich gebe zwar zu, dass ich mir den VLC-Quellcode angesehen habe, um zu verstehen, welche Uhren verwendet werden, aber ich gebe nicht vor, zu verstehen, was dort vor sich geht. Darüber hinaus war vieles, was ich getan habe, empirisch. Wenn also die Leute, die VLC wirklich verstehen, Aufschluss darüber geben, wie dies besser zu erreichen ist, bin ich am empfänglichsten. Mit diesen Vorbehalten aus dem Weg zu gehen, scheint das, was ich getan habe, zu funktionieren.
Aufbau
Ich habe vier Bereiche, in denen ich Audio teilen möchte, und eine Sammlung von Computern verschiedener Jahrgänge, die ich bereit bin, Audio bereitzustellen. Auf einigen dieser Computer wird Linux (Ubuntu 12.04) ausgeführt, auf anderen Windows. Insgesamt war es einfacher, die Linux-Boxen als die Windows-Boxen zu synchronisieren, aber es war möglich.
Unter Linux mussten die pulseaudio-Treiber mit ppa: ubuntu-audio-dev / ppa aktualisiert werden, um die Version mit niedriger Latenz zu erhalten. Ansonsten war die Konfiguration Vanille. VLC beklagte sich über die Latenz ohne dieses Upgrade. Ich hoffe, wenn wir den 14.04 bekommen, wird dieses Problem verschwinden.
Auf den Windows-Boxen starte ich Windows 7 Pro.
Das Audio wird von VLC einer Linux-Box geliefert, die unabhängig von den Abspielgeräten ist. Es befindet sich direkt hinter der Firewall, an der das Netzwerk ins Haus gelangt.
Das Netzwerk ist eine Mischung aus kabelgebundenem und kabellosem Gigabit (802.11g).
Dinge, die möglicherweise keine Rolle spielen
Da ich ein Zeitnarr bin, sind alle Maschinen mithilfe von NTP auf der Sub-Millisekunden-Ebene zeitlich miteinander verbunden. Auf den Linux-Boxen ist dies trivial. Auf der Windows-Box verwende ich die Meinberg-Implementierung von ntp (zu finden unter http://www.meinbergglobal.com/english/sw/ntp.htm ). Die Box, die das Audio bereitstellt, wird mit den normalen externen Zeitservern synchronisiert . Die Zeit der Wiedergabegeräte wird jedoch ausschließlich mit dem Audioserver synchronisiert und verfolgt diesen genau. Die Zeile aus der Datei ntp.config auf den Wiedergabegeräten, die dies ausführt
server 10.17.0.12 iburst burst minpoll 4 maxpoll 4 prefer
Dies stellt sicher, dass alle 16 Sekunden Zeitprüfungen durchgeführt werden - natürlich mache ich mir keine Sorgen um den Netzwerkverkehr.
Server
Der Server ist so eingerichtet, dass er den PulseAudio-Stream überwacht, sodass alles, was ich auf dem Server spiele, in den Ausgabestream eingespeist wird.
Der Ausgangsstrom ist ein RTSP-Strom, der zwei Kanäle mit 44,1 kHz bedient. Auch hier gibt es wahrscheinlich Dinge, die ich tun könnte, um Bandbreite zu sparen, aber ich bin mehr daran interessiert, die Synchronisierung richtig zu machen, als die Bandbreite zu minimieren.
In den Einstellungen (unter Extras)
Audio - Stellen Sie in den einfachen Einstellungen sicher, dass Audio mit Zeitdehnung aktiviert ist
Klicken Sie für die restlichen Einstellungen unten auf der Seite "Einstellungen" auf "Alle"
Echtzeitpriorität zulassen
- Netzwerksynchronisation - Überprüfen Sie die Netzwerk-Hauptuhr und geben Sie die IP des Hauptservers an (in meinem Fall dieses System)
- Audio - Aktivieren Sie Audio-Resampling in hoher Qualität und aktivieren Sie das Kontrollkästchen Time Stretching für Audio aktivieren
- Input / Codecs - dieser scheint am wichtigsten zu sein - scrollen Sie nach unten zum Ende der Seite
- Stellen Sie das Netzwerk-Caching auf 300 ms ein. Möglicherweise müssen Sie dies abhängig von der Geschwindigkeit und der Konkurrenz Ihrer Computer variieren. Bei Mine 300 ist dies ausreichend
- Clock Reference Average Counter - ich fand, dass 1000 gut funktionierte - dies scheint zu beeinflussen, wie schnell die Synchronisation kleinen Zeitänderungen folgt
- Aktivieren Sie die Uhrzeitsynchronisation
- Clock Jitter - 30 ms funktioniert auf meinen Systemen
- Überprüfen Sie die Netzwerksynchronisation
- Ich habe Dateinamen für das Record-Verzeichnis und das Timeshift-Verzeichnis angegeben. Ich weiß nicht, ob dies von Bedeutung ist
- Timeshift-Granularität - Ich habe wieder auf 1000 gesetzt und bin mir nicht sicher, ob das wichtig ist.
Kunden
Richten Sie die Clients so ein, dass sie den vom Server bereitgestellten Stream wiedergeben.
Die Clients sind bis auf wenige Ausnahmen so eingestellt, dass sie mit dem Master übereinstimmen - hier werde ich nur die Unterschiede auflisten
Windows-Einstellungen
- Erhöhen Sie die Priorität des Prozesses
- Stellen Sie die Uhrzeitquelle auf Systemzeit (gefährlich!) - Ich habe die anderen Einstellungen ausprobiert und sie tendieren dazu, zu driften. Dies scheint gut zu funktionieren, solange das NTP seinen Job macht. Wenn ich NTP ausschalte, beginnen die Dinge zu driften. Beim Betrachten des Quellcodes sieht es so aus, als ob diese Option verwendet wird
GetSystemTimePreciseAsFileTime ()
- auf modernen Systemen ist dies ein Sub-Mikrosekunden-Timer und scheint die Uhr zu sein, die NTP verwaltet. Ich bin mir sicher, dass es einen Grund gibt, warum es als gefährlich eingestuft ist. Die Verwendung erfolgt also auf eigenes Risiko - es scheint für mich zu funktionieren.
- In der Netzwerksynchronisation - Überprüfen Sie nicht die Netzwerk-Hauptuhr (dies ist immerhin der Client). Geben Sie die IP-Adresse für Ihre Hauptuhr an.
Ansonsten ist alles wie beim Master.
Linux -
Einstellungen
- Sie haben keine Wahl auf der Uhr - Sie müssen die IP des Masters genau wie für Windows angeben.
Vorbehalte
Nach alledem scheinen alle von mir eingerichteten Linux-Clients gut zu funktionieren - sogar ein sehr altes Netbook mit sehr wenig PS.
Windows ist eine andere Geschichte. Ich habe zwei Boxen mit i7-Prozessoren ausprobiert - sie sind relativ neu und schnell. Einer, ein Lenovo-Laptop, arbeitet mit dem obigen Rezept. Die andere, eine Shuttle-Box, funktionierte bis zu einem gewissen Grad, aber nach ein paar Stunden begann sie zu treiben. Endlich habe ich aufgegeben und es auf Dual Boot mit Ubuntu eingestellt. Sobald ich das getan habe, hat einfach alles funktioniert. Obwohl ich davon überzeugt bin, dass Windows funktionieren kann, da ich einen Existenznachweis habe, scheint Linux einer zuverlässigen Lösung näher zu sein. Ich habe jetzt drei Boxen mit dem Linux-Client, und alle funktionieren einwandfrei und bleiben auf Zeitskalen von vielen Stunden synchron, ohne dass der VLC-Client neu gestartet werden muss.