Streamdev-plugin

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Streamdev-client: remotetimers plugin hinzugefügt)
(VTP-Protokoll)
Zeile 94: Zeile 94:
 
* Das HTTP-Protokoll
 
* Das HTTP-Protokoll
  
==== VTP-Protokoll ====
+
==== VTP (VT-Protokoll) ====
  
 
VTP steht für Video Transfer Protocol. Dabei handelt es sich um ein textbasiertes Protokoll, ähnlich dem SVDRP. Ein Client kann über entsprechende Befehle Kanäle abfragen und umschalten sowie Streaming-Clients anmelden. Die eigentliche Übertragung der Audio- oder Audio- und Videodaten erfolgt dann allerdings über eine separate Verbindung auf einem anderen Port. Das Verfahren ist mit dem beim FTP-Protokoll vergleichbar, wo Client und Server ebenfalls untereinander eine separate Verbindung aushandeln, auf der dann die eigentlichen Daten fließen.
 
VTP steht für Video Transfer Protocol. Dabei handelt es sich um ein textbasiertes Protokoll, ähnlich dem SVDRP. Ein Client kann über entsprechende Befehle Kanäle abfragen und umschalten sowie Streaming-Clients anmelden. Die eigentliche Übertragung der Audio- oder Audio- und Videodaten erfolgt dann allerdings über eine separate Verbindung auf einem anderen Port. Das Verfahren ist mit dem beim FTP-Protokoll vergleichbar, wo Client und Server ebenfalls untereinander eine separate Verbindung aushandeln, auf der dann die eigentlichen Daten fließen.

Version vom 15. März 2007, 11:34 Uhr

Inhaltsverzeichnis

Beschreibung

Autor: Sascha Volkenandt

Das Streamdevice Plugin ist die Netzwerkerweiterung des VDR. Es besteht aus zwei Teilen:

  • Streamdev-server
  • Streamdev-client

Der Server-Teil (streamdev-server) kommt in einem VDR zum Einsatz, der eine (oder mehrere) DVB-Karten enthält. Er stellt über DVB empfangene Kanäle als Streams im Netzwerk zur Verfügung.

Der Client-Teil (streamdev-client) kann in einem VDR eingesetzt werden, der selbst keinerlei DVB-Karte(n) enthält, sondern stattdessen Kanäle über das Netzwerk, also per TCP/IP empfängt.

In den meisten Fällen kommt also in einem VDR entweder das eine oder das andere Plugin zum Einsatz. Man kann allerdings theoretisch zwei VDR im Netzwerk die beide jeweilse eine DVB-Karte haben, quasi über Kreuz miteinander verbinden, so dass sie ihre Karten gegenseitig nutzen können. Das kann dann sinnvoll sein, wenn man beispielsweise auf beiden VDRs denselben Kanal schauen und gleichzeitig einen anderen Kanal aufnehmen möchte.

Für das Verständnis des Plugins betrachten wir das Linux-Programm "sort". Es empfängt einen Datenstrom von der Standardeingabe, sortiert ihn und schickt ihn zur Standardausgabe. Die Standardeingabe ist normalerweise am Gerät "Tastatur" und die Ausgabe am Gerät "Monitor" angeschlossen. Effektiver ist es natürlich, die Datenströme umzuleiten und an Dateien anzuschließen:

sort < unsortiert.txt > sortiert.txt

Beim VDR kann es mehrere Ein- und Ausgabedatenströme geben. Diese sind normalerweise an den Geräten Tuner und Decoder angeschlossen, können aber auch an Plugins umgeleitet werden. Aufnahmen kann man in diesem Zusammenhang wie "eingefrorene" Datenströme auffassen.

Das Streamdev Plugin ist nun in der Lage, Ausgabedatenströme entgegenzunehmen, über das Netzwerk an andere Rechner zu versenden und dort als Eingabedatenströme wieder abzuliefern.

ACHTUNG: In der Datei streamdevhosts.conf wird festgelegt welche Rechner auf den Streaming-Server zugreifen dürfen. Wird diese Datei nicht angepasst, ist kein Streaming möglich. Kann diese nicht gefunden werden, kann man sie ueber find / -name streamdevhosts.conf finden. Hat man einen Rechner im Netz mit der IP 192.168.1.1 schaltet man den Zugriff fuer alle Rechner frei indem man in die Datei um den Eintrag 192.168.1.0/24 ergaenzt

Möglichkeiten

normale Arbeitsstationen

Es kann auf ganz normalen Rechnern, die am Netzwerk hängen, ferngesehen werden. Leider gibt es noch keine Möglichkeit wie man direkt Timer bearbeiten kann, aber dafür gibt es ja den genialen Vdradmin.

Konsolen und andere starke Clients

XBoxen usw. können genauso wie ganz normale Arbeitsstationen über ihre Mediaplayer meistens die Videostreams abspielen.

Linux Clients

Es kann zum Beispiel mit dem Xine-plugin oder dem Softdevice-plugin ein VDR auch ohne DVB-Karte in einem Linux Rechner betrieben werden. In Verbindung mit LIRC steht so eine Konfiguration einem normalen VDR in nichts nach. Mit dem Umweg über Linux als Betriebssystem auf der X-Box bekommt man so einen VDR mit OSD zum Laufen.

Streamdev-server

Dieses Plugin tritt auf dem VDR, welcher das Plugin gestartet hat, als Empfänger (Receiver) auf. Ein Empfänger erhält die Datenströme für die er sich registriert hat und kann diese weiterverarbeiten. Im Falle Streamdev wird der Datenstrom in das gewünschte Format gewandelt und über das Netzwerk an andere Rechner versendet. Das Streamdev-server Plugin kann dabei mehrere Clients gleichzeitig mit Live-TV versorgen. Eine ausreichend Anzahl an DVB-Karten vorausgesetzt, kann jeder Client frei sein Programm wählen.

Streamen von Aufnahmen ist derzeit nicht möglich. Das Aufnahmen-Verzeichniss muss dem Client daher per Netzwerkfreigabe zur Verfügung gestellt werden.

Entgegen anderslautender Gerüchte ist das Streamdev-server Plugin kein (Ausgabe-)Gerät (Device).

Streamdev-client

Dieses Plugin verhält sich gegenüber VDR, welcher das Plugin gestartet hat, wie ein Eingabegerät. Es empfängt Videoströme per Netzwerk, wandelt das Streamingformat erneut und übergibt die Ströme an VDR. Die Daten werden vom VDR verarbeitet, als kämen sie von einer DVB-Karte.

Ein Ausgabegerät muss noch bereitgestellt werden, entweder mit einer echten fullfeatured DVB-Karte oder über ein anderes Plugin (Dxr3-, Softdevice-, Xine-plugin).

Client-Lösung mit Xine-Plugin - Skizze zum Verständnis: Link

Mittlerweile unterstützen weitere Plugins Client-Server-Architekturen mit VDR und sind so eine optimale Ergänzung für den Streamdev-client:

Zusammenspiel

  • VDR1
    • Eingabedatenströme von
      • DVB-Karte(n)
    • Ausgabedatenströme an
      • Decoder
      • Streamdev-server Plugin (sendet an VDR2 und VDR3)
  • VDR2
    • Eingabedatenströme von
      • DVB-Karte(n)
      • Streamdev-client Plugin (empfängt von VDR1)
    • Ausgabedatenströme an
      • Decoder
  • VDR3
    • Eingabedatenstrom von
      • Streamdev-client Plugin (empfängt von VDR1)
    • Ausgabedatenstrom an
      • Softdevice Plugin

Dabei kann man die Verbindungen auch mischen. Zwei VDRs können sich ihre DVB-Karten gegenseitig zur Verfügung stellen.

Der Fantasie sind dabei (fast) keine Grenzen gesetzt. Es muss aber gesichert sein, dass mindestens ein Eingabedatenstrom mit dem Gerät "Tuner" und ein Ausgabedatenstrom mit dem Gerät "Decoder" (Fernseher) verbunden ist.

Soweit die idealisierte Theorie. In der Praxis gibt es da noch einige Schwierigkeiten zu überwinden, da der VDR von sich aus eigentlich nicht netzwerkfähig ist. So haben wir weitere Verbindungen für die Steuerung und das OSD zu berücksichtigen.

Beispiele

Beispiel 1:

Es gibt einen VDR mit mehreren DVB-Karten und einem installierten streamdev-server. Ein weiterer VDR, der per Netzwerk angeschlossen ist, streamt sich alles, da er keine DVB-Karte als Eingang hat, sondern eine DXR-3 Karte, Softdevice-plugin, Xine-plugin oder Fullfeatured DVB-Karte ohne angeschlossene SatLeitung.

Beispiel 2:

Es gibt mehrere VDRs mit je einer DVB-Karte die alle unabhänig voneinander laufen. Jedoch gibt es ein gemeinsames Videoverzeichnis auf einem Server das per SMB oder NFS mit den Clients verbunden wird. Empfehlenswert ist NFS. Wenn ein Server zum Einsatz kommt, dann kann man diesem mehrere Budget-DVB-Karten geben, so dass alle Aufnahmen zentral gemacht werden. So muss nur ein System an sein, wenn Aufnahmen anstehen und es muss nur ein System auf besonders hohe Energiesparung ausgelegt werden. Um die Clients besonders leise zu bekommen, kann man ja durch den Server auf Aufnahmefestplatten verzichten, und die Clients per Netzwerk booten lassen. So ist kein bewegtes Teil mehr im VDR. Als Alternative zum Netzwerk-Boot gibt es noch die Möglichkeit über einen IDE-nach-Compact-Flash-Wandler zu booten, was den besonderen Gimmick bietet, dass jeder User auch seine eigene CF-Karte in den vor ihm stehenden Client schieben kann.

Protokoll-Informationen

Das streamdev-server-Plugin enthält genau genommen gleich zwei Server, die auf unterschiedlichen Ports horchen und sich mit unterschiedlichen Protokollen ansprechen lassen. Die beiden verwendeten Protokolle sind

  • Das VTP-Protokoll
  • Das HTTP-Protokoll

VTP (VT-Protokoll)

VTP steht für Video Transfer Protocol. Dabei handelt es sich um ein textbasiertes Protokoll, ähnlich dem SVDRP. Ein Client kann über entsprechende Befehle Kanäle abfragen und umschalten sowie Streaming-Clients anmelden. Die eigentliche Übertragung der Audio- oder Audio- und Videodaten erfolgt dann allerdings über eine separate Verbindung auf einem anderen Port. Das Verfahren ist mit dem beim FTP-Protokoll vergleichbar, wo Client und Server ebenfalls untereinander eine separate Verbindung aushandeln, auf der dann die eigentlichen Daten fließen.

Bei einer VDR-VDR-Verbindung wird das VTP-Protokoll benutzt. Eine Beschreibung des Protokolls findet sich im Quellcodes des streamdev-Plugins in der Datei PROTOCOL.

HTTP-Protokoll

Das streamdev-server-Plugin stellt auf Port 3000 einen HTTP-Server zur Verfügung, sofern dieser nicht per Konfiguration abgeschaltet worden ist. Auf diesen HTTP-Server kann man theoretisch mit einem ganz normalen Webbrowser zugreifen.

Der HTTP-Server des streamdev-server-Plugins horcht normalerweise auf Port 3000.

Wenn der VDR beispielsweise die Adresse 192.168.0.1 im Netzwerk hat, gibt man im Browser ein

http://192.168.0.1:3000/

Es sollte dann eine Liste von Kanälen erscheinen. Hinter dem Namen jedes Kanals verbirgt sich ein Link auf einen HTTP-Aufruf mit dem man beginnen kann, den betreffenden Kanal zu streamen.

Sonstiges

  • Mit der neuen Version klappt der Verbindungsaufbau zu Clients stabiler.
  • Bei Wireless-LAN-Verbindungen könnte die Durchsatzrate nicht ausreichen. Wenn es starke Schwankungen in der Übertragungsrate gibt, aber es im Durchschnitt reicht, dann wäre es als Tipp ratsam den Puffer höher zu stellen.
  • Für schmalbandige Netzwerkverbindungen kann das Bild mittels MEncoder entsprechend heruntergerechnet und durch "Extern" in der URL abgerufen werden.


Bilder

Einstellungen


Konfiguration

Da es keine externen Abhängigkeiten gibt, gestaltet sich die Installation recht einfach. Es wird installiert, wie jedes andere Plugin. Eine Besonderheit besteht darin, dass beim Übersetzen gleich zwei Plugins entstehen, der Server und der Client. Gestartet werden sie mittels "-P streamdev-server" bzw. "-P streamdev-client".

Der Zugriff auf den Server wird durch die Konfigurations-Datei streamdevhosts.conf geregelt. Das Streamdev-Plugin bringt eine Beispieldatei mit, die folgendermaßen installiert wird:

cp $SOURCEDIR/VDR/PLUGINS/src/streamdev/streamdevhosts.conf.example $VDRCONFIG/plugins/streamdevhosts.conf

Wichtig: Anschließend muss die Datei editiert und an das eigene Netzwerk angepasst werden. Andernfalls ist kein Streaming möglich!

Danach muss man in der channels.conf des Clients die Programme hinzufügen, die vom Streaming-Server stammen und in Zukunft von dem 'virtuellen' DVB-Device empfangen werden sollen. Im einfachsten Fall genügt es, auf dem Client eine Kopie der channels.conf des Servers zu installieren. Empfangen Client und Server unterschiedliche Kanal-Quellen (z.B. Server: DVB-S, Client: DVB-T), so werden die Einträge aus der channels.conf des Servers einfach in die des Clients eingefügt.

Bei aktuellen Versionen müssen die Kanal-Nummern auf Client und Server nicht übereinstimmen. Es müssen auch nicht alle Kanäle des Server in die channels.conf des Clients aufgenommen werden.

Feste Zuordnung Kanal zu Gerät

Im Normalfall findet VDR selbst heraus, ob ein Kanal lokal oder über Streamdev empfangen werden kann. Eine feste Zuordnung ist aber mit Hilfe des CA-Feldes der Datei channels.conf möglich. Mit den Werten 1-4 wird der Kanal fest an die DVB-Karte mit der entsprechenden Nummer gebunden. Die Nummerierung der DVB-Karten untereinander ergibt sich aus der Reihenfolge in der die Treiber geladen wurden. Die Werte ab 5 werden Ein- und Ausgabegeräten zugeteilt, die von Plugins bereitgestellt werden. Hier ist die Reihenfolge in der die Plugins geladen werden entscheidend.

Beispiele:

  • VDR mit Full-featured-DVB-Karte und Streamdev-client: FF-Karte wird Nummer 1, Streamdev-client Nummer 5
  • VDR mit DXR3-Karte und Streamdev-client: Streamdev-client hat Nummer 6, da das Ausgabegerät DXR3 zuerst geladen wurde
  • VDR mit Streamdev-client und Softdevice-plugin: Streamdev-client bekommt Nummer 5, da Softdevice erst danach geladen wird

Die CA-ID der channels.conf kann über das Kanal-Menü oder direkt in der Datei angepasst werden:

Men & Motors:12421:h:S28.2E:27500:2345:2347:2346:5:7560:0:0:0

(Channels.conf von VDR 1.2.6 - die fünft'letzte' 5 bestimmt das fünfte Device)

Achtung: In aktuellen streamdev-CVS Versionen schert sich der Streamdev-client nicht um diese Einstellung. Wird also z.B. "5" für Streamdev-client konfiguriert, so wird der Kanal wie erwartet nicht über lokale DVB-Karten empfangen. Soll andersherum aber z.B. mit dem Wert "1" ein Kanal fest der ersten DVB-Karte zugeordnet werden, wird unter Umständen dennoch Streamdev zum Empfang genutzt. Der Patch "respect_ca.diff" aus dem "patches"-Verzeichnis der Streamdev-Quellen behebt dieses Problem.

FF-Karte als reines Ausgabegerät

Im Client kann eine Full-featured-DVB-Karte als Ausgabegerät verwendet werden. Deren Tuner muss dabei nicht zwangsweise in der Lage sein, Programme zu empfangen (z.B. wenn sich in der Nähe des Clients keine Anschlussmöglichkeit bietet). Für VDR ist dies allerdings nicht erkennbar und er versucht dennoch ein Programm über die FF-Karte zu empfangen. Nun könnte man die channels.conf editieren und dort jeden Kanal an die Gerätenummer des streamdev-clients binden. Einfacher ist es, VDR zu patchen:

Der LocalChannelProvide-Patch ermöglicht es, den Empfang über lokale DVB-Karten im OSD-Menü unter "Einstellungen --> OSD" zu deaktivieren. Zu finden ist der Patch im "patches"-Verzeichnis der Streamdev-Quellen.


Sonstiges

Probleme

Umschaltprobleme 1

Komischerweise hat jeder, hatte ich (BlackKing) auch, mit dem Streamdev-Server ein Problem: Man kann immer nur den Kanal anschauen welcher auch gerade auf dem VDR-Server eingestellt ist. Da viele dieses Problem haben, und ich hoffe das jeder diese Stelle hier durchliest, hoffe ich, dass ich es vielen Leuten leichter mache.

Hintergrund: Dieses Problem tritt nur dann auf, wenn man nur eine DVB-Karte eingebaut oder mehrere Karten hat, diese aber alle mit Aufnahmen beschäftigt sind. Der VDR schaut auch immer einen Sender, auch wenn er nicht mal ein Ausgabedevice hat. Da nirgends so richtig dieses Problem beschrieben ist, und es überall nur heißt, man soll suchen usw., schreibe ich es nochmal hier:

Lösung: Im OSD folgen wir diesen Menüpunkten: OSD --> Einstellungen --> Plugins --> streamdev-server
Beim Pausierverhalten stellen wir nun "immer pausieren" ein, und nun schaltet der streamdev-server den VDR auf den Kanal den man streamen will und dann funktioniert es...

Sollte man kein OSD am VDR haben, kann man auch manuell die setup.conf vom VDR bearbeiten. VDR vor dem ändern stoppen!:

streamdev-server.AllowSuspend = 1
streamdev-server.SuspendMode = 1

Umschaltprobleme 2

Was wenn das Pausierverhalten schon auf "immer pausieren" steht, das Problem aber weiter besteht? Ursache könnte eine ältere CVS-Version des Streamdev-Servers sein. Dabei berücksichtigt der Server nicht, dass die aktuell vom Streamdev-client genutzte DVB-Karte ja eigentlich umgeschaltet werden darf (sofern nicht noch anderweitig in Verwendung).

Ein eindeutiger Indikator für dieses Problem: Das Umschalten über direkte Eingabe einer Kanalnummer funktioniert, mit Kanal+/- hingegen wird immer nur zwischen den Kanälen der gerade aktiven Transponder gewechselt.

Lösung: Aktuelles Streamdev aus dem CVS holen oder den im Bug-Tracking hinterlegten Patch verwenden.

Fehler im Plugin

Tipps

Streamdev-client mit mehreren Verbindungen oder Servern

Von sich aus kann das streamdev-client-Plugin nur genau eine Verbindung zu genau einem festgelegten Server unterhalten. Mit einem einfachen Trick ist es aber möglich, auch mehrere Server zu kontaktieren oder von einem Server gleichzeitig mehrere Transponder zu empfangen. Letzteres ermöglicht es z.B. ein Programm auf dem Client aufzuzeichnen, während ein anderes angeschaut wird. Sogar das osdpip-plugin kann auf dem Client genutzt werden.

Um dies zu erreichen, muss einfach nur eine Kopie des streamdev-client-Plugins unter einem anderen Namen erstellt werden:

cp libvdr-streamdev-client.so.VERSION libvdr-streamdev-client2.so.VERSION

Beim Start des VDR beide Plugins laden

-Pstreamdev-client -Pstreamdev-client2

Im OSD-Menü unter Einstellungen --> Plugins sind nun zwei streamdev-client-Plugins verfügbar die unabhängig voneinander konfiguriert werden können.

Streamdev ab gcc version 4.xxx

Ab der Version 4.x.x des gcc benötigt man die CVS Quellen zum kompillieren.

cd $SOURCEDIR/VDR/PLUGINS/src/
cvs -d:pserver:anoncvs@vdr-developer.org:/var/cvsroot co streamdev

Wunschliste

Snapshot

cvs -d:pserver:anoncvs@vdr-developer.org:/var/cvsroot login
cvs -d:pserver:anoncvs@vdr-developer.org:/var/cvsroot co streamdev

Links

  1. Homepage des Plugins
  2. VDR Stream Player (M$)
  3. Spielt Live-TV und Aufnahmen auf einem Windows-PC ab
  4. Mac OS X VDR stream switcher (MPlayer needed)
In anderen Sprachen