streamdev plugin und streamen von pvrinput Kanälen

  • Das streamdev Plugin läuft nicht korrekt mit dem pvrinput Plugin zusammen. pvrinput Kanäle können nur als PES gestreamt werden, nicht als TS. Warum - keine Ahnung...


    Hier ein log von pvrinput bei dem mit PES erfolgreich gestreamt wird.


    Beim Schalten auf einen pvrinput Kanal wird geprüft ob das pvrinput device den Kanal verfügbar machen kann, dann die Karte in Setchanneldevice eingestellt, anschließend die PIDs gesetzt und das device geöffnet und mit GetTSPacket() periodisch die TS Pakete abgefordert. Soweit alles super.


    Nun das ganze mit TS streaming..

    Code
    pvrinput: 17:44:06 cPvrDevice::ProvidesSource Source=C -> true
    pvrinput: 17:44:06 cPvrDevice::ProvidesCa 300 (UHF 29) CaID=0xa1 -> true
    pvrinput: 17:44:06 cPvrDevice::ProvidesChannel: UHF 29 already set -> true.
    pvrinput: 17:44:06 cPvrDevice::ProvidesChannel 300 (UHF 29) 535,25MHz, -> true
    pvrinput: 17:44:06 cPvrDevice::ProvidesCa 300 (UHF 29) CaID=0xa1 -> true
    pvrinput: 17:44:06 cPvrDevice::SetChannelDevice 300 (UHF 29) 535,25MHz using ivtv device
    pvrinput: 17:44:06 cPvrDevice::ParseChannel


    Wie vorher, pvrinput stellt den Kanal zur Verfügung, aber VDR holt keine TS Pakete ab und öffnet auch kein device, setzt kein PIDs. Ende - nix weiter passiert. Logischerweise kann streamdev nichts streamen, wenn die Pakete von pvrinput niemals abgeholt wurden.


    WARUM? Was macht streamdev bei TS anders?


    streamdev-0.3.3, pvrinput-2008-06-01, vdr-1.4.7 && vdr-1.6.0


    Gruß wirbel

  • Könntest Du streamdev auch mal mit DEBUG-Option laufen lassen?

    Code
    cd PLUGINS/src/streamdev/; make clean; DEBUG=1 make all


    Achtung: Debug-Ausgaben kommen über stderr - nicht ins Log.


    Je nachdem wie alt Dein streamdev-0.3.3 ist (wird vermutlich irgendeine CVS-Version sein), evtl. auf streamdev-0.3.4 aktualisieren.

  • stderr ist perfekt.



    Demnächst also hier ein log von 0.3.4 mit DEBUG=1, mal sehn wann mein VDR grad nicht aufzeichnet .

  • Nach einer längeren Probiersession hier die Ergebnisse. Wenn du weitere Infos brauchst sag Bescheid.


    setup.conf:

    Code
    streamdev-server.AllowSuspend = 0
    streamdev-server.HTTPBindIP = 0.0.0.0
    streamdev-server.HTTPServerPort = 3000
    streamdev-server.HTTPStreamType = 0     <--- TS
    streamdev-server.MaxClients = 2
    streamdev-server.ServerPort = 2004
    streamdev-server.StartHTTPServer = 1
    streamdev-server.StartServer = 1
    streamdev-server.SuspendMode = 0
    streamdev-server.VTPBindIP = 0.0.0.0


    ./vdr -c /etc/vdr-1.6.0 -P pvrinput -P streamdev-server -v /video0


    per VLC-0.8.6e streamen von kanal 300:

    Code
    UHF 48;wirbelscan:687250:PVRINPUT|TV|PAL:P:0:301:300:305:A1:10996:0:0:82


    -> Ja, die Kanal-Syntax ist korrekt. ;)


    in vlc : http://192.168.6.2:3000/300


    ----erstmal: nicht funktionierend: mit TS bei vdr-1.6.0 & pvrinput & streamdev-0.3.4 ------


    nix weiter - kein Bild, kein Ton.


    -----und nun *exakt* das gleiche aber mit PES------


    streamdev-server.HTTPStreamType = 1 <--- PES


    Okay. Bild & Ton,alles paletti.



    ------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------


    nun noch einmal das ganze mit einem vdr-1.4.7 und streamdev-0.3.3-20080325-http, aber ner andren channels.conf (tut hier nix zur Sache..):



    -> also wie gehabt: TS = Kein Bild, kein Ton.



    und nun mit PES:


    -> PES = Bild und Ton.

  • Der Unterschied zwischen PES und TS ist, dass (bei HTTP-Streaming) für PES die Pids aus der channels.conf verwendet werden, während für TS die Pids mit Hilfe der Klasse cStreamdevPatFilter aus der PMT gefischt werden. Offenbar wird keine Pid gefunden, weswegen auch kein Receiver gestartet wird und der Bildschirm dunkel bleibt.


    Wie sieht das bei dem DVB-Stream von pvrinput bzgl. PAT und PMT aus?


    Gemäß Deiner Debug-Logs wird kein PMT gefunden. Im Zweifelsfall die Methode cStreamdevPatFilter:: Process() in server/livestreamer.c mit Debug-Ausgaben versehen um zu sehen, was überhaupt gefunden wird.

  • In pvrinput wird vom mpeg encoder ein pes stream geliefert (ist nötig wegen teletext insertion) und im Plugin in ts Pakete gewandelt die vom VDR wie bei jedem device per GetTSPacket angeholt werden (Wandlung in device.c bzw. reader.c: ParseProgramStream und PesToTs). AFAIK gibt es deswegen keinerlei pat/pmt/nit im ts Stream.


    Insofern wäre es besser auch hier die vorhandenen Infos der channels.conf zu nutzen.

  • Der folgende Patch sollte das ursprüngliche Verhalten wiederherstellen:


    Ich denke, eine Setup-Option mit der zwischen beiden Varianten gewählt werden kann wäre am sinnvollsten.

  • Ich probiers mal aus.


    Wie werden dann die Daten von pvrinput abgeholt, mit GetTSPacket? Per Filter geht prinzipiell nicht, da kein demux device vorhanden ist an dem man filtern könnte.

  • Nach ein paar Tagen Pause nun weiter...



    Ich hab deinen Patch ausprobiert:



    Gehen tut so weder DVB noch pvrinput bei mir. Irgendwas hakt da noch..

  • Klar, probier ich das WE mit dieser Version.


    Ich bin mir sicher, dass nichts ankommt, da alle dvb Kanäle mit ts und VLC funktionieren. Vielleicht hat pvrinput auch einen Teil des Problems in sich, mal sehn..

  • Jetzt das log mit dieser streamdev Version


  • Die Logs sind allesamt unauffällig. In jeder Kombination wird auch etwas in Richtung Client gesendet (siehe Meldung "Max. Transmit Blocksize was: ...").


    Bin gerade im Wiki über einen veralteten Eintrag von Dez. 2006 gestolpert, laut dem VLC mit dem streamdev TS nichts anfangen kann. Die Daten werden einfach weggeworfen. Damit wird klar, weshalb Du mit der alten streamdev-Version auch bei DVB nichts siehst.


    Mit dem aktuellen streamdev funktioniert VLC und TS. Der Patch dazu stammt von Petri Hintukainen. Schau Dir mal den zugehörigen Eintrag im Bugtracker an: Offenbar braucht VLC eine PCR und wenn es keine PAT und PMT gibt, fehlt natürlich auch die PCR.

  • Das ließe sich ja theoretisch in pvrinput nachrüsten, auch wenn vdr selbst diese Daten nicht braucht.


    Werden diese Daten dann auch mit GetTSpacket abgeholt?

  • Zitat

    Werden diese Daten dann auch mit GetTSpacket abgeholt?


    Ja. Die entscheidende Stelle in streamdev ist die Methode cStreamdevPatFilter:: Process(..) in server/livestreamer.c. Der if-Block sucht aus der PAT die PMT und fügt deren PID dem cFilter hinzu. Der "else if"-Block verarbeitet die PMT. Insbesondere werden die PIDs von EIT und PCR ausgelesen und ein neuer cReceiver für diese PIDs an das Quell-Device gehängt. Somit kannst Du PAT, PMT und PCR direkt über GetTSPacket(..) zufüttern.

  • Moin!


    Ist es sinnvoll das in pvrinput nachzurüsten oder sollte sich streamdev PAT/PMT usw. ausdenken, wenn es keine findet? Dann würde auch Material abgedeckt sein, dass nicht aus pvrinput kommt, sondern aus irgendwelchen anderen Quellen.


    mini.

  • Zitat

    Ist es sinnvoll das in pvrinput nachzurüsten oder sollte sich streamdev PAT/PMT usw. ausdenken, wenn es keine findet?


    Halte eine Anpassung von pvrinput für wesentlich sinnvoller. Bekanntermaßen stellt kls in VDR 1.7 das Aufzeichnungsformat von PES auf TS um. Wenn wir mal davon ausgehen, dass die PCR-PID mit aufgezeichnet wird, dann können VDR-Aufnahmen direkt als Datei mit VLC angeschaut werden. Stellt pvrinput keine PCR zur Verfügung, wird's damit nix.

  • Ich denke wir werden *beide* Plugins anpassen müssen.., schließlich sollte streamdev auch mit devices laufen, die über keinen demuxer verfügen.


    ich habe gestern mal angefangen die ersten Zeilen für pvrinput zusammenzustellen und habe gemerkt, dass das leider recht schwierig & langwierig ist wenn man sowenig wie ich davon versteht..

  • Zitat

    Ich denke wir werden *beide* Plugins anpassen müssen.., schließlich sollte streamdev auch mit devices laufen, die über keinen demuxer verfügen.


    Hm - würde ich Dir recht geben, wenn Dir ein device einfällt, von dem niemand aufzeichnen sondern immer nur live sehen oder streamen möchte. Ansonsten sehe ich eher die Signalquelle oder VLC in der Pflicht. Eine Anpassung in streamdev wird sonst niemandem helfen, der VDR 1.7 Aufnahmen mit VLC ansehen möchte. Die VLC-Jungs lassen sich eher nicht dazu bewegen, TS-streams ohne PCR zu akzeptieren: Ähnliches Problem.


    Zitat

    ich habe gestern mal angefangen die ersten Zeilen für pvrinput zusammenzustellen und habe gemerkt, dass das leider recht schwierig & langwierig ist wenn man sowenig wie ich davon versteht..


    In den streamdev-sourcen findet Du in libdvbmpeg/transform.c eine insert_pat_pmt() Funktion. Dürfte Dir weiterhelfen. Bezüglich PCR muss ich aber leider passen. Damit habe ich mich bisher noch nie beschäftigt.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!