DVB.NET 4.0 Konzepte: Arbeiten mit Quellen

Nach den ganzen Einführungen hier einmal etwas Praktisches am Beispiel: es ist die Aufgabe, eine Aufzeichnung eines Senders (sagen wir mal ZDF) in eine TS (Transport Stream) Datei zu starten und gleichzeitig an einen anderen Rechner im Netzwerk zu versenden (der die Aufzeichnung dann Live mit VLC oder dem DVB.NET / VCR.NET Viewer betrachten kann).

Erst einmal zu der schlechten Nachricht: DVB.NET 3.5.1 wird im Kern keine direkte Namensauflösung von Sendern anbieten! Was genau ich da zur Verfügung stelle, weiß ich noch nicht. Aber ganz trivial wird es nicht, Sender mit identischem Namen zu unterscheiden – etwa die vielen Channel 4 Varianten auf Astra 2. Meiner Ansicht nach ist das ein eigenständiges Problem, dass auch gesondert gelöst werden muss, aber im Moment noch nicht Thema ist.

Um einen Sender in DVB.NET zu adressieren, benötigt man dessen eindeutige DVB Kennung (Ursprungsnetzwerk, Transportstrom, Dienst) – für das ZDF wäre das (1, 1079, 28006). Mit Hilfe der neuen statischen .NET Klasse ProfileManager ermittelt sich daraus eine Liste von SourceSelection Instanzen. Hat man mehrere aktive Geräteprofile, so kann es dann auch mehrere Auswahlinstanzen geben – konkret auch von verschiedener Empfangsart wie DVB-S und DVB-C. Jede Auswahlinstanz enthält weitere Details wie den Namen des Geräteprofils, über das die gewünschte Quelle erreicht werden kann. Jede Instanz kann über die .NET Eigenschaft SelectionKey in eine Zeichenkette serialisiert und später daraus rekonstruiert werden – genau dies wird dann etwa von VCR.NET 3.5.1 zur eindeutigen Identifikation einer Quelle verwendet, ohne die ganzen Probleme mit dem Umbennen von Sendern, die einige Anbieter das eine oder andere Mal machen.

Eine SourceSelection ist eigentlich auch die Verbindung zwischen der Auswahl des Anwenders und der eindeutigen Erkennung einer Quelle samt Geräteprofil, DVB.NET Ursprung, Quellgruppe (Transponder) etc. Eine Anwendung wie VCR.NET wird dem Anwender eine geeignete Namensrepräsentation zur Auswahl anbieten, selbst aber die eindeutige Repräsentation via SelectionKey speichern.

Hat man einmal eine Auswahlinstanz, so kann man diese mit der Methode SelectGroup aktivieren – nachdem man sich für die Benutzung einer DVB.NET Geräteabstraktion über den HardwareManager angemeldet hat. SelectGroup entspricht einem Tune Vorgang und wählt eine Quellgruppe (Transponder) an, so dass die darauf übertragenen Datenströme zum Empfang bereit stehen.

Der letzte Schritt es es dann nur noch, über eine StreamSelection Instanz den Empfang der Quelle zu aktivieren. Sollen mehrere Quellen der gleichen Gruppe ausgewertet werden (im Beispiel etwa zusätzlich zum ZDF auch noch KiKa und DLF Radio), so ist der Vorgang mit entsprechenden Auswahlinstanzen zu wiederholen. SelectGroup kann aufgerufen werden, ist aber optional: DVB.NET 3.5.1 erkennt automatisch, dass die selbe Quellgruppe aktiviert werden soll und macht dann einfach nichts.

In einer StreamSelection kann angegeben werden, welche Aspekte der Quelle mit in den Empfang aufzunehmen sind – etwa welche Tonspuren welcher Art und Sprache. DVB.NET 3.5.1 ermittelt automatisch die aktuell angebotenen Aspekte und erfüllt diese Wünsche soweit als möglich.

Aus der Aktivierung wird eine SourceStreamManager Instanz geliefert. Diese kann nun einfach verwendet werden, um den Empfang in eine Datei zu lenken und / oder den Netzwerkversand zu aktivieren. Hier nun das volle Beispiel:


// Station of interest
SourceIdentifier station = new SourceIdentifier
{
Network = 1,
TransportStream = 1079,
Service = 28006
};

// Find the station of interest
SourceSelection zdf = ProfileManager.FindSource( station )[0];

// Create the device instance
using (HardwareManager.Open())
{
// Tune
zdf.SelectGroup();

// Create new
StreamSelection selection = new StreamSelection();

// MP2
selection.MP2Tracks.AllLanguages = true;

// AC3
selection.AC3Tracks.AllLanguages = false;
selection.AC3Tracks.Languages.Add( "Deutsch" );

// Videotext
selection.Videotext = true;

// EPG
selection.ProgramGuide = true;

// Create access context
using (SourceStreamsManager streams = zdf.Open( selection ))
{
// Create the stream
streams.CreateStream( @"v:\videorecorder\ts\test1.ts" );
streams.StreamingTarget = "localhost:6666";

// Report
Console.WriteLine( "Recoding active" );
Console.ReadLine();
}
}

Für den Empfang werden alle MP2 Tonspuren, die deutsche AC3 Tonspur und der Videotext angefordert. Zusätzlich werden Informationen aus der Programmzeitschrift eingebettet. Die empfangenen Daten werden in eine TS Datei gebündelt und gleichzeitig an den TCP/IP UDP Port 6666 auf dem selben Rechner versendet.

Natürlich ist auch wie bisher der direkte Zugriff auf die DVB Hardware möglich, etwa der gezielte Empfang einzelner Teildatenströme (PIDs) und der direkten Auswertung im Speicher. Aber das ist hier nicht das Thema, hier ging es um die oberste Ebene des Zugriffs auf Quellen.

So long

Jochen

DVB.NET 4.0 Konzepte: Sendersuchlauf

Wie in den früheren Version werden auch DVB.NET 3.5.1ff Geräteprofile die Liste der Sender (Quellen in der neuen Notation) in sich tragen. Ebenso wird es möglich sein, gemeinsame Listen für verschiedene gleichartige Geräte zu verwenden – etwa ein DVB-S(2) Geräteprofil mit Senderliste für eine Hardware, die von anderer DVB-S(2) Hardware im gleichen Rechner mit genutzt wird. Dabei ist es jetzt auch möglich, unsinnige Quellgruppen (Transponder) aus der Referenz auszublenden – eine Hauppauge Nexus-S kann mit den DVB-S2 Quellgruppen einer TechnoTrend S2-3200 nichts anfangen.

Ebenso wie früher ist in einem Geräteprofil mit Quellen vermerkt, auf welcher Basis diese ermittelt wurden. Im Beispiel DVB-S (DVB-C und DVB-T sind diesbezüglich etwas einfacher) werden wie bisher erst einmal die einzelnen Satellitenantennen definiert, die von der jeweiligen Hardware mittels DiSEqC 1.0 angesteuert werden können (die alte Bezeichnung LNB wird durch den Begriff des Ursprungs ersetzt). Jeder Ursprung wird dann mit einer Satellitenkonfiguration verbunden, etwa Astra 1 auf 19.2° Ost. Und damit kommen wir zum eigentlichen Punkt dieses Artikels…

Für jeden Satelliten (ähnlich für DVB-C und DVB-T, hier geht es nur um das Prinzip) wird erst einmal eine Liste aller Quellgruppen (Transponder) verwendet, die bei einem Suchlauf angesteuert und nach Quellen (Fernsehen, Radio, Sonstiges) abgesucht werden sollen. Anders als bisher geht nun DVB.NET 3.5.1ff hin und ermittelt nach dem Ansteuern einer Quellgruppe die Gesamtkonfiguration des Satelliten über die so genannte SI Tabelle Network Information Table (NIT). Hier können etwa Quellgruppen vermerkt sein, die in der statischen (evtl. veralteten) Liste nicht vorhanden sind (man denke etwa an die neuen Frequenzen für Phoenix et al). Optional können Frequenzen und andere Empfangsparameter korrigiert sein – DVB.NET benutzt hier einen etwas entspannteren Vergleichsalgorithgmus, der auch Quellgruppen mit leicht veränderter Frequenz korrekt als identisch erkennt. Ein Sendersuchlauf berücksichtigt die Daten der NIT vorrangig. Da diese Informationen relativ selten gesendet werden (es kann schon mal über 10 Sekunden dauern, bis diese zur Verfügung stehen), versucht DVB.NET den Abruf so selten wie möglich vorzunehmen. Konkret wird die NIT nur für die Quellgruppen angefordert, die sich in der ursprünglichen (statischen) Liste befunden haben und nicht durch die NIT einer so ausgewerteten Quellgruppe schon bestätigt wurden.

Darin stecken zwei Ideen und ein Zwang. Die primäre Idee ist es, die Liste der Quellgruppen pro Satellit auf ein Minimum zu beschränken – DVB.NET 3.5.1ff wird dazu auch ein eigenes Werkzeug anbieten, dass zu einer Liste einen minimalen Satz von Quellgruppen ermittelt, über deren NIT Informationen die Liste rekonstruiert werden kann. Astra 1 ist da ein sehr gutes Vorbild: hier reicht eine einzige (!) Quellgruppe, um alle Frequenzen zu erfassen. Zusätzlich soll es aber auch möglich sein, mehr als eine Quellgruppe für die Ermittelung der vollständigen Liste einsetzen zu können – vital für DVB-T, daher der Zwang. Die zweite Idee schließlich ist die Annahme, dass NIT Informationen für Gruppen von Quellgruppen identisch sind – i.e. wenn die NIT der Quellgruppe A B enthält, dann wird A auch in der NIT von B vorhanden sein und die NIT von B ist mit der von A identisch. Damit kann bei den langen Listen, die aus der alten DVB.NET Version übernommen wurden, das Warten auf die NIT soweit als möglich reduziert werden. Ob das so passt, werden wir sehen… Ziel ist es, für die wichtigsten Ursprünge irgendwann einmal minimierte Listen zu haben – DVB-S ebenso wie DVB-C und DVB-T.

Ansonsten ist ein Suchlauf nicht viel anders als früher. Lediglich der Umfang der Informationen im Geräteprofil ist dramatisch reduziert – es werden keinerlei Datenstromkennungen (PID) mehr fest eingetragen – dazu an anderer Stelle mehr. Nach einen Suchlauf wird die neue Liste üblicherweise mit der alten zusammengeführt, i.e. die neuen Quellen ersetzen die alten, aber gerade nicht verfügbare Quellen werden nicht entfernt (etwa bedingt durch eine zeitliche Beschränkung der Ausstrahlung). Bekannte Mechanismen wie das Ausblenden von Quellgruppen und Quellen oder das Anpassen von Quellinformationen wie dem Sendernamen werden ebenso unterstützt.

Ok, zum Schluss: der gesamte Algorithmus für den Sendersuchlauf soll weitgehend konfigurierbar als eigenständige Komponente (.NET Klasse) nutzbar (! angeboten war es immer schon, nur die Nutzung war kniffelig !) angeboten werden. Diese wird dann nicht nur im neuen DVB.NET Konfigurationswerkzeug, sondern auch in VCR.NET 3.5.1 genutzt.

Puh, das war wieder viel zu viel. Genug!

Jochen

DVB.NET 3.5.1 Suchlauf