Streamdev und VTP

  • Hallo !


    Ich entwickle zur Zeit einen Windows Client für VDR und Streamdev. Ich verwende dabei nicht die HTTP-Funktion sondern das VTP-Protokoll.
    Der Client soll genauso funktionieren wie ein VDR LINUX Client.
    So weit so gut.
    Eigentlich funktioniert das schon ganz gut. Ich bekomme auch Bild und Ton. Allerdings ist der Stream egal ob ich TS, PS oder PES verwende ziemlich blockig und fehlerhaft.
    Meine Frage: Was ist das genau für ein Stream den Streamdev liefert, wie ist er aufgebaut. Kann mir da jemand weiterhelfen ? Vielleicht komme ich dann dahinter, was ich noch falsch mache. Gibt es ein Tool, mit dem ich den Stream analysieren kann (außer ProjectX - funktioniert nicht).


    Danke.


    Gruß

  • LarsAC:


    Die Doku von VTP ist im streamdev Plugin enthalten.


    Gizmine:


    ES steht für Elementary Stream. Das ist ein reiner Video oder Audiostrom in demselben Format, wie es auch auf Festplatte gespeichert wäre (Endungen .mpv/.m2v für Video und .mpa/.mp2/.ac3 für Audio).


    PES steht für Packetized Elementary Stream. Hier werden ein Video-ES und null bis n Audio-ES gemeinsam in einem Mux übertragen, wobei keine Sync-Informationen übertragen werden. Video und Audio müssen zeitnah demuxed und parallel abgespielt werden.


    PS steht für Program Stream. Das ist ein Stream mit mehreren Spuren, also auch z.B. mehreren Angles oder Subtitles zusätzlich zur Videospur, und enthält auch Sync-Informationen. Dieses Format ist das, was auch auf DVDs und VCDs verwendet wird, und in dem .mpg Dateien gespeichert sind. Leider ist der PS-Muxer vom streamdev wohl nicht der beste.


    TS steht für Transport Stream und ist das was vom Satelliten geliefert wird. Es enthält beliebig viele ES und andere Daten (Videotext, Subtitles) und wird in 188 Bytes grossen Häppchen geliefert. Im Unterschied zu PES enthält TS noch die Fehlerkorrekturinformationen.


    Womit spielt Dein Client den Datenstrom denn ab? Der Windows Media Player kommt wohl nur mit "besseren" PS Strömen klar, als streamdev sie liefert. Es gibt einen DirectShow-Filter von ffmpeg (ffdshow) der ganz gut sein soll, evtl auch mplayer probieren.

  • Also ich bastele mir mit verschiedenen DirectShow-Filtern in Delphi etwas zusammen.
    Das Problem ist aber schon dass der Stream scheinbar fehlerhaft von STREAMDEV gestreamt wird. Egal in welchem Format, ob ES, PES, PS oder auch TS.
    Wenn ich den Stream auf Festplatte schreiben lasse und dann z.B. mit ProjectX analysieren lasse, gibt es nur Fehler.
    Abspielen lässt sich der Stream nur kurz, man sieht ein paar fehlerhafte Bruchstücke, dann Ende. Da hilft auch VLC oder FFDSHOW nicht.


    Das ganze klappt übrigens mit dem http-Server von STREAMDEV einwandfrei. Nur da lässt sich kein TS streamen. Deshalb wollte ich auf VTP ausweichen.


    Kann bei der Übertragung über das Netz noch etwas schief laufen ?


    Gizmine

  • Ich versuche zur zeit etwas ähnliches (was heißt zur Zeit, das letzte mal kam ich vor zwei Monaten zum programmieren, bin im Diplomarbeitsstress).
    Jedenfalls kann ich mal kurz skizieren, wie weit ich gekommen bin, (erstmal ich schreibe in c++).
    Ich habe eine kleine Testapplikation geschrieben, die über das VTP-Protokoll den Live-Stream in eine Datei schreibt, funktioniert auch einwandfrei egal ob TS oder PS.
    Der nächste Schritt einen Directshowfilter der den Stream vom Server im Push-Modus ausgibt, funktioniert auch einwand frei solange der Stream in eine Datei ausgegeben wird.
    Der einzige Demultiplxer der Daten im Push-Modus übernimmt ist der Mpeg2-Demultiplexer (Mpeg2-Splitter ist im Pull-Modus und Pull Modus geht nicht). Mit den TS-Streams funktioniert es gar nicht, vermutlich da irgendwelche informationen im TS-Stream von Streamdev fehlen, die bei live TV dabei wären (viellicht PAts oder PMT?) jedenfalls, wenn ich die PIDs aus meiner channel-conf für den jeweiligen Kanal im Demultiplxer eingebe kommt draussen nichts an.
    PS-Streams funktionieren bei einigen Sendern (DVB-t rtl oder sat.1 bouqet )(auch hier muß ich die streamid per hand in den Demultiplexer eingeben) und da auch zuverlässig, bei manchen funktionieren sie aber nicht (z.B. Kabel ARD-Digital). Das heißt die PS-Steams im Pull-modus scheinen tw. nicht 100% so zu sein wie der Mpeg2-demultiplexer dies will.
    Also bin ich dabei jetzt in den Empfangsteil, gleich einen Demultiplexer einzubauen der mit den empfangenen PS-Streams zurecht kommt!


    Falls interesse an code-fragmenten besteht PN an mich.


    Gruß


    Marten

    vdr experimental, Femon, vdr live, acpi-wakeup, vompserver, undelete, epgsearch, vdr-burn, Raspberry Pi und Vompserver Windows Client (build from git)

    Einmal editiert, zuletzt von MartenR ()

  • Für mich sieht das so aus als ob ein Teil des streams verloren geht, überprüfe doch mal die teile des Codes die die Verbindung über das Netzwerk machen für den Videostrom und überprüfe teile, wo etwas in einen Buffer kopiert wird. Für mich sieht das nämlich so aus als ob mit der Zeiger arithmetik geschlammt wurde, vielleicht ein Ringbuffer, wo die Daten am ende nicht richtig geschrieben werden, so dass alle paar KByte mal ein Byte fehlt oder sowas.


    Poste doch mal den Netzwerktransfercode, dann kann man vielleicht sehen, wo der Fehler ist. Auf Streamdevseite ist jedenfalls alles korrekt implementiert (bei mir funktionierts ja).


    Marten

    vdr experimental, Femon, vdr live, acpi-wakeup, vompserver, undelete, epgsearch, vdr-burn, Raspberry Pi und Vompserver Windows Client (build from git)

  • Gizmine: Wenn Du die UDP-Version nimmst, steig bitte auf eine neuere oder eine ältere Version um! Der UDP-Transfer war ein misslungener Test (wenn Du ein geswitchtes Netzwerk hast kommt u.U. garnichts mehr richtig an).


    Die TCP-Übertragung der A/V-Daten im VTP sollte sich nicht von der im HTTP Modus unterscheiden.

  • Ich verwende Version 0.3.1-1 aus dem c't Repository und tcp.
    udp wäre auch schwer zu programmieren, da es extrem zeitkritisch ist und außerdem der Stream auf Konsistenz geprüft werden müßte, damit es nicht Bilder wie bei der dir gibt.


    Marten

    vdr experimental, Femon, vdr live, acpi-wakeup, vompserver, undelete, epgsearch, vdr-burn, Raspberry Pi und Vompserver Windows Client (build from git)

  • MartenR:


    Ich habe mir meinen Programmcode nochmal genauer angeschaut und habe tatsächlich von meinem 'Empfangspuffer' jeweils ein Byte zu wenig weggeschrieben. Ziemlich offensichtlicher Fehler, bin aber dennoch nicht selbst drauf gekommen. Jetzt funktioniert alles bestens. PES, PS und auch TS. Danke, war ein guter Tip.


    Gizmine

Jetzt mitmachen!

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