[TEST] streamdev: VTP Section Streaming / Erweitertes HTTP TS-Streaming

  • Quote

    Original von schmirl
    Mögliche Ursache gefunden. Patch mit Debug-Ausgabe liegt im Bugtracker. Egal ob es damit klappt oder nicht: Bitte im Log nach Meldungen "streamdev-server: read from externremux returned 0" suchen und diese posten.


    Ok, ich habe das aktuelle streamdev paket von e-tobi gepatched und installiert.
    Leider bekomme ich noch immer den oben genannen Fehler!
    Wenn der Stream abbricht hängt der mplayer noch ca. 20 Sekunden und bringt dann den bereits beschriebenen Segfault.


    Output der syslog:

  • Mein Verdacht hat sich somit bestätigt. Patch im Bugtracker überarbeitet - jetzt sollte es passen (sorry - komme im Moment leider nicht selbst zum Testen). Im Problemfall wird jetzt "streamdev-server: buffer full while reading from externremux" ins log geschrieben. Durch das "m_ResultBuffer->SetTimeouts(500, 100);" sollte die Meldung aber nur noch 2 mal pro Sekunde erscheinen. Sollte wider Erwartens gar nichts mehr gehen, das wieder auf "m_ResultBuffer->SetTimeouts(0, 100);" zurücksetzen.

  • Quote

    Original von schmirl
    Mein Verdacht hat sich somit bestätigt. Patch im Bugtracker überarbeitet - jetzt sollte es passen (sorry - komme im Moment leider nicht selbst zum Testen). Im Problemfall wird jetzt "streamdev-server: buffer full while reading from externremux" ins log geschrieben. Durch das "m_ResultBuffer->SetTimeouts(500, 100);" sollte die Meldung aber nur noch 2 mal pro Sekunde erscheinen. Sollte wider Erwartens gar nichts mehr gehen, das wieder auf "m_ResultBuffer->SetTimeouts(0, 100);" zurücksetzen.


    Danke erstmal für die Hilfe, Schmirl!


    Mit dem neuen Patch hat sich die Situation auf jeden Fall verbessert!
    Jedoch verhält sich das Streamen noch nicht so "flexibel" wie mit der uralt version.


    Ich versuche nochmal die drei Situationen (streamdev neu, streamdev neu + patch,
    streamdev uralt) unter der Bedingung "schlechter WLAN Empfang" zu charakterisieren:
    Dabei beziehe ich mich wieder auf das Streaming vom VDR zu meinem Nokia N800
    (mplayer -framedrop -cache 800 http://.../extern/#)
    1. streamdev neu
    Bild + Ton frieren sofort ein (=> mplayer segfault).


    2. streamdev neu + patch
    Bild fängt an zu stocken, Ton ist zunächst noch ok.
    Dann friert alles ein (mplayer segfault).


    3. streamdev uralt (0.3.1+cvs20050522-27)
    Bild fängt an zu stocken, dann friert das Bild ein (Ton kann zu dem Zeitpunkt noch ok sein).
    Danach fängt der Ton an zu stocken und setzt evtl. sogar mehrere Sekunden aus.
    Wenn der WLAN Empfang sich dann wieder stabilisiert, bekomme ich nach und nach
    wieder einen Ton und dann auch (irgendwann) wieder ein flüssiges Bild.
    Ich habe dazu extra nochmal die alte version installiert und ausgiebig getestet (war mir
    selbst nicht mehr so sicher, ob das alte wirklich so stabil lief).
    Der Mplayer hatte sogar mit Aussetzern von ca. 10-20 Sekunden keine Probleme!
    Ich habe es nicht geschafft einen Segfault zu erzeugen.


    Ich bin schon auf deine Auswertung der log gespannt ;)

  • Also - was passiert:
    Bis 18:25:14 läuft immer mal wieder der Puffer voll (max. 4 Sekunden), danach erholt sich das ganze aber jedesmal wieder. Ab 18:27:30 ist wieder der Puffer längere Zeit voll. Nach 12 Sekunden scheint es externremux.sh zu bunt zu werden und der Prozess macht die Tür zu. Kannst Du mal die Ausgabe der Programme aus externremux.sh prüfen (ggf. musst Du hier Änderungen vornehmen, damit die Ausgabe nicht nach /dev/null geht)?


    Um zu bestätigen, dass tatsächlich externremux.sh das Problem ist, nimm mal bitte testweise in extern/remux.c das "m_Active = false;" nach der "EOF reading from externremux" Meldung raus (Zeile 135). Erholt sich der stream nun irgendwann wieder obwohl die EOF-Meldungen kommen? Falls dem so wäre, habe ich wohl ein grundlegendes Verständnisproblem :schiel.

  • Hallo Schmirl,


    ich habe nun drei weitere Tests durchgeführt.
    1a: streamdev + patch, mplayer auf client ohne segfault
    1b: streamdev + patch, mplayer auf client mit segfault
    2: streamdev + patch, m_Active auskommentiert


    Meine externremux.sh:
    - bis auf den mencoder Teil aus irgendeinem wiki "geklaut"
    - zum Testen das -msglevel auf 6 (verbose messages, kein debugging) gesetzt



    Fall 1a: vdr-plugin-streamdev-server_0.3.3~cvs20070509 + patch
    Auszug aus der syslog:


    => mplayer: "Exiting... (End of file)"


    Auszug aus der externremux.log:

    Code
    /tmp/externremux.12718/out.avi: Error writing file.
    
    
    Exiting...



    Fall 1b: vdr-plugin-streamdev-server_0.3.3~cvs20070509 + patch
    Auszug aus der syslog:


    => mplayer: "Segmentation fault"


    Auszug aus der externremux.log:

    Code
    /tmp/externremux.12842/out.avi: Error writing file.
    
    
    Exiting...


    Fall 2: vdr-plugin-streamdev-server_0.3.3~cvs20070509 + patch - m_Active
    Auszug aus der syslog:


    => mplayer: "Segmentation fault"


    Auszug aus der externremux.log:

    Code
    /tmp/externremux.13357/out.avi: Error writing file.
    
    
    Exiting...


    Leider gibt die mencoder log nicht mehr her! Zum Testen hatte ich auch mal das erste
    debugging level vom mencoder eingestellt, jedoch brachte das auch keinen
    genaueren Hinweis auf einen speziellen Fehler.
    Ich hoffe, dass dir die logs bei der Fehlereingrenzung weiterhelfen.

  • Quote

    Fall 1a: vdr-plugin-streamdev-server_0.3.3~cvs20070509 + patch

    Code
    May 16 17:14:01 myhost vdr: [12720] ERROR: streamdev-server: couldn't send data: Connection timed out


    Das ist im Vergleich zu den bisherigen Logs ein neues Problem. In server/streamer.c, Zeile 53 gibt es einen 15s Timeout. Wenn der Server für diese Zeit keinerlei Daten mehr zum Client schicken kann, wird die Verbindung abgebrochen. Hier gab es früher keinen Timeout, was zu einem Lastproblem wurde: streamdev mit 99% automatisch killen [help wanted]. Wenn Dir die 15s zu knapp sind, kannst Du die natürlich gerne verlängern. Ob bei so langen Aussetzern das streamen aber noch Freude macht...?


    Quote

    Fall 2: vdr-plugin-streamdev-server_0.3.3~cvs20070509 + patch - m_Active

    Code
    May 16 17:36:25 myhost vdr: [13362] ERROR: streamdev-server: couldn't send data: Connection timed out


    Gleiches Problem wie im Fall 1a. Auch hier der 15s Timeout. Allerdings vermisse ich hier die "EOF reading from externremux"-Meldung. Hast Du die ebenfalls auskommentiert?


    Sowohl bei Fall 1a als auch bei Fall 2 schließt streamdev die HTTP-Verbindung. Dass einmal der mplayer einen segfault bringt, das andere mal nicht, dürfte damit wohl eher ein Bug im mplayer sein. Denkbar wäre, dass mplayer einmal WLAN-bedingt das EOF in Form eines Reset- oder Fin-Pakets erhält, das andere mal nicht und sonstwie gegen die Wand läuft.

  • Das 15s Timeout ist kein Problem, eher ein Vorteil.


    Im Fall 2 habe ich nur die eine m_Active Zeile auskommentiert!
    Ich habe festgestellt, dass mit dem auskommentierten m_Active
    die Verbindung nicht so schnell abbricht! Bei schlechtem WLAN
    Empfang (wenn die Verbindung dann nicht komplett wegfällt)
    hatte ich oft einen längeren Bildaussetzer, jedoch der Ton blieb
    weitgehend erhalten. In solchen Situationen kann es jedoch etwas
    dauern, bis dann das Bild wieder flüssig dargestellt wird.


    Ich werde versuchen noch einmal die beiden Varianten (mit/ohne
    m_Active) zu Protokollieren. Wie die letzten logs gezeigt haben, ist
    es nicht immer einfach die optimalen Testbedingungen herzustellen,
    die dann wirklich repräsentativ für das eigentliche Problem sind.

  • Wie versprochen habe ich nun noch einmal die beiden Varianten
    mit/ohne m_Active verglichen. Rein subjektiv muss ich sagen, dass
    die Variante mit auskommentiertem m_Active wesentlich unempfindlicher
    gegen Empfangsstörungen ist (durchaus vergleichbar mit dem uralt streamdev).
    Da ich mir den Quelltext (noch) nicht angesehen habe und daher auch nicht
    genau weiß, was da eigentlich abläuft, sind diese Feststellungen alle rein
    subjektiv ;)
    Weil die Logs diesmal etwas länger sind, habe ich sie in den Anhang gepackt!
    syslog_1.txt: m_Active auskommentiert
    syslog_2-4.txt: m_Active nicht auskommentiert (3 Testläufe)

  • Patch im Bugtracker ist aktualisiert. Problem war: Ich nutze cRingBufferLinear::Free() um festzustellen, dass der Puffer voll ist. Nun liefert das aber nicht immer nur 0 wenn der Puffer voll ist, sondern auch mal -1 ?(. Ob das so in Ordnung ist oder ein Bug im VDR sei mal dahingestellt.

  • Ich habe den neuen Patch getestet! Bisher verhält sich streamdev genau so
    wie ich mir das vorstelle. Die Verbindung bricht nicht ohne weiteres ab.
    Selbst bei "längeren" Aussetzern wird der Stream weiter gesendet.
    In der syslog steht hier und da mal ein ring buffer overflow ERROR.
    Anbei der Auszug aus der syslog.


    Schmirl, hast du eigentlich schon einmal darüber nachgedacht, das externremux
    um mehrere Instanzen zu erweitern? Es wäre sehr praktisch, wenn man auf
    verschiedene "extern[0 - n]" Streams zugreifen könnte. Ich denke da vor allem
    an WLAN User, die gleichzeitig den Laptop und PDA oder ähnliches zum Empfang von
    Datenströmen verwenden. Die Leistungsunterschiede dieser Endgeräte können ja sehr
    groß sein. Aktuell muss dann für jedes Gerät das gleiche (für das leistungsschwächste Gerät
    ausgelegte) Skript verwendet werden.
    Mehrere Instanzen z.B. für den Anwendungszweck Laptop, PDA
    http://xxx/extern/1 => externremux.sh (Laptop, normale Auflösung, hohe Qualität)
    http://xxx/extern1/1 => externremux1.sh (Laptop, normale Auflösung, niedrige Qualität)
    http://xxx/extern2/1 => externremux2.sh (PDA, angepasste Auflösung, niedrige Qualität)

  • Quote

    Ich habe den neuen Patch getestet! Bisher verhält sich streamdev genau so
    wie ich mir das vorstelle.


    Prima - ist eingecheckt.


    Quote

    Schmirl, hast du eigentlich schon einmal darüber nachgedacht, das externremux
    um mehrere Instanzen zu erweitern?


    Ja, habe ich ;). Ich bin gerade dabei die HTML-Seiten die streamdev liefert zu überarbeiten. In diesem Zuge hatte ich auch vor, dass jeder Pfad der nicht vorbelegt ist (wie TS, PS, ...) die externremux.sh aufruft und der verwendete Pfad als Parameter an die externremux.sh übergeben wird. Beispiele: http://xxx/dsl6000/1 http://xxx/h264/1 ... Innerhalb der externremux.sh muss dann nur noch der Parameter abgefragt und die passende Aktion ausgeführt werden.


    Das ganze wird aber noch eine Weile dauern, da ich unter chronischem Zeitmangel leide und mit HTTP-Streaming eigentlich gar nichts am Hut habe.

  • Hi schmirl,


    gibt es diesbezüglich Fortschritte?


    > Ich bin gerade dabei die HTML-Seiten die streamdev liefert zu überarbeiten.
    > In diesem Zuge hatte ich auch vor, dass jeder Pfad der nicht vorbelegt ist (wie TS, PS, ...) die externremux.sh aufruft
    > und der verwendete Pfad als Parameter an die externremux.sh übergeben wird.
    > Beispiele: http://xxx/dsl6000/1 http://xxx/h264/1 ... Innerhalb der externremux.sh muss dann nur noch der Parameter
    > abgefragt und die passende Aktion ausgeführt werden.


    Danke für die Arbeit an streamdev und Grüße
    Funzt

  • Es geht voran, aber leider äußerst langsam. Momentan bleibt mir kaum Zeit für VDR. Aktueller Status:


    FERTIG: Kanallisten als HTML und M3U (alle Kanäle, alle Gruppen, Kanäle einer Gruppe, Baumansicht)
    TODO: HTML-Startseite mit Auswahl des Streaming-Formats
    TODO: Auf JavaScript basierende Baumansicht der HTML-Kanalliste
    TODO: externremux.sh mit Aufrufparametern

  • Quote

    Weil ich werde von diesem Bug geplagt, und kann deshalb nicht zu einer aktuellen Streamdev Version wechseln.


    Aber mit dem Patch geht es doch bei Dir, oder doch nicht?


    Ich möchte den Patch nicht einchecken, da es nur ein Workaround ist. Das eigentliche Problem wird nicht behoben und für VDR 1.4 Benutzer wird die Sache mit dem Patch nicht wirklich effizienter. Um eine saubere Lösung zu finden fehlt mir momentan die Zeit. Wenn sich aber jemand anders daran versuchen will - immer gerne.

  • Hallo,


    Ich möchte gern über billige http Streaming Clients (uPnP) DS TS Streams von einer Reelbox AVG abgreifen. Ich teste gerade mit einer Buffalo Linktheater PC3.


    Server und Clients befinden sich in einem 100Mbit LAN. Das Streamen von Aufnahmen funktioniert tadellos. Jedoch der Livestream hat Bild- und Tonaussetzer. Machmal steht das Bild 5 ... 10 Sekunden lang, um dann das noch nicht Gezeigte im Schnelldurchlauf zu zeigen.
    Manchmal läuft der Stream minutenlang angenehm störungsfrei.
    Ich schließe das Linktheater aus, weil VLC auf meinem Laptop sich ähnlich verhält.
    Im Logfile sind keinerlei Debug-Ausschriften von vdr / streamdev zu lesen.
    Ich greife den Stream mit folgender URL ab http://xxx.xxx.xxx.xxx:3000/TS/1


    In diesem Thread ist zu lesen, daß man über http noch Informationen wie Kanalliste und EPG abrufen kann. Ist das irgendwo beschrieben bzw. streamdev im Speziellen?


    Danke.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!