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