Streamdev: Remux von Aufnahmen im Git

  • Hallo zusammen,


    habe am Wochenende das Remuxen von Aufnahmen eingecheckt. Bitte testen.


    Remuxen ist nur für TS-Aufnahmen möglich. Mit alten PES-Aufnahmen funktioniert es nicht, auch wenn das Streamdev Web-Menü derzeit noch etwas anderes suggeriert.
    Spulen in Remux-Aufnahmen ist leider nicht möglich. Angeblich kann VLC das (siehe http://projects.vdr-developer.org/issues/1880), ich muss mir das aber erst mal in Ruhe anschauen. Bin sehr skeptisch, dass das mit streamdev jemals möglich werden wird.
    Um die Wiedergabe an einer bestimmten Position zu beginnen, kann der Parameter "pos=" an die URL angehängt werden (also z.B. http://127.0.0.1:3000/ext/1.rec?pos=...), der folgende Werte kennt (# steht jeweils für eine Zahl):

    • resume: Wiedergabe an der Stelle fortsetzen, an der sie mit VDR beendet wurde. Streamdev aktualisiert die resume-Position nicht!
    • resume.#: Wie vor. # steht für die Wiedergabe-ID laut VDR Setup. Interessant z.B. wenn die Multiuser-Funktion des Remotetimers-Plugins genutzt wird.
    • mark.#: Ab Markierung #
    • time.#: Ab Sekunde #
    • frame.#: Ab Frame #
    • #: Startposition in Prozent der gesamten Aufnahme (# muss zwischen 0 und 100 liegen)


    Auf der TODO-Liste steht nun, all diese Möglichkeiten auch komfortabel im Streamdev Web-Menü anzubieten.

  • Das klingt doch gut.
    Dann muss ich meinen Server mal aktualisieren.


    Ist das dann ein HTTP Progressive Download? Warum musst Du da neu muxen?
    Oder meinst Du transcode für Aufnahmen?

  • wie machst Du es mit dem transcodieren wenn in dem File ein PMT Switch drinnen ist?
    ffmpeg bekommt das glaube ich nicht mit. Der hängt sich auf die VPID und wenn da nichts mehr kommt, dann ist ende. Er wechselt die VPID nicht.
    Testen kann man das mit dem TEST-R Sender.


    Machst Du dafür ein remux? Also das z.B. ffmpeg dann immer die selbe VPID bekommt?

  • Geil! Einfach nur Geil! :tup


    Vielen Dank. Darauf habe ich lange gewartet


    Allerdings bekomme ich nach recht kurzer Zeit einen Fehler im Syslog:

    Code
    vdr: [2859] ERROR (extern.c,307): read failed: Die Ressource ist zur Zeit nicht verfügbar

    Komiscerweise nur mit dem Handy und immer an der gleichen Stelle der jeweiligen Aufnahme, Mit Firefox und VLC Plugin tritt der Fehler nicht auf.
    Ich habe das Plugin kompiliert und nur die libvdr-streamdev-server.so in das Plugins Verzeichnis kopiert, damit meine schon bestehende Konfiguration nicht überschrieben wird. Die Externremux ist auch eine Eigenkomposition, die avconv verwendet. Mit TV habe ich bisher keinerlei Probleme...
    Das avconv Kommando sieht so aus:

    Code
    avconv -f mpegts -i - -threads 2 -filter:v "scale=iw*min(480/iw\,270/ih):ih*min(480/iw\,270/ih), pad=480:270:(480-iw*min(480/iw\,270/ih))/2:(270-ih*min(480/iw\,270/ih))/2, yadif"  -vcodec libx264 -maxrate 1024K -bufsize 1024K -acodec libmp3lame -b:a 128K -ar 44100 -ac 2 -async 50 -f mpegts pipe:1


    Irgendeine Idee, was das sein könnte?


    [edit]
    Das Problem tritt auch auf, wenn ich PROG=cat mitgebe, was dasselbe tut, wir das mitgelieferte externremux Script
    [/edit]

    Grüße


    Hannemann

    Einmal editiert, zuletzt von hannemann ()

  • decembersoul: für die Wiedergabe von Aufzeichnungen nutzt Streamdev den gleichen Code wie bei Live-TV. Streamdev ändert die VPID nicht.


    hannemann: Freut mich, dass es im großen und ganzen funktioniert. Folgende Änderung könnte Dein Problem lösen:

  • Voll ins Schwarze... :bounce1


    Ich hatte ein paar Aussetzer aber das WLAN in der Büroküche ist ziemlich schlapp. Ich mach jetzt mal nen Test an einer Stelle wo besserer Empfang ist und melde dann, ob er einen ganzen Film durchgehalten hat.

    Grüße


    Hannemann

  • Hallo,


    Mir kommt es so vor, als würde er Streams nach zwei Stunden neu starten. Kann das sein?

    Grüße


    Hannemann

  • Mir kommt es so vor, als würde er Streams nach zwei Stunden neu starten. Kann das sein?


    Du benutzt doch jetzt nicht dieses Plex-Plugin, oder? IIRC dann sind da die 2 Stunden fest eingestellt.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Neee... das läuft doch bei mir noch nicht.

    Grüße


    Hannemann

  • Was heißt neu starten? Fängt er von vorne an? Dann könnte es ein Überlauf sein. Gibt es Meldungen im Log?

    Die Aufnahme fängt von vorne an. Im Log habe ich nichts gefunden, wenn mir was auffällt, sage ich Bescheid.
    Gestern habe ich zum testen mal Gladiator und Inception gestreamt, beide länger als 2 Stunden und beide fingen kurz vor Ende wieder von vorne an. Es kam mir so vor, als könnten das jeweils 2 Stunden gewesen sein, ich habe aber nicht genau mitbekommen, bei welchem Zeitstempel, zumal VLC auch nicht anzeigt, wie lange das Video schon läuft.
    Vorhin habe ich einen Aufnahme mit 1:59 länge bis zum Ende durchlaufen lassen -> Funktioniert.
    Aktuell läuft gerade eine, die 2:05 lang ist... mal sehen was passiert.

    Den Patch für die anfänglichen Abbrüche kann ich dann aber wohl einchecken?


    Das kannst du machen. Funktioniert wunderbar.

    Grüße


    Hannemann

  • Wegen einem blöden Meeting habe ich das Ende der Aufnahme verpasst. Ich muss es noch mal testen.


    Was ich aber noch getestet habe und was funktioniert ist, das ich aus meiner WebApp in Android Chrome heraus eine Aufnahme an den Chromecast schicken kann :D


    Das funktioniert, wenn man ein HTML Video Tag verwendet. Dann kann man im Vollbild Modus auch einen Chromecast auswählen.
    Das ist so cool.... Ich brauch gar keinen Client mehr um meine Aufnahmen auf dem Fernseher anschauen zu können. Kein Plex, kein BubbleUpnp... einfach so mit dem streamdev-server. Große Freude :tup
    Ich muss noch ordentlich experimentieren um eine gute Bildqualität zu erreichen (im Moment ist meine externremux auf Mobil Geräte bzw. kleine Auflösung und geringe Bitrate optimiert) aber ich glaube, das wird.

    Grüße


    Hannemann

  • Es gibt ein paar Screenshots....


    Rest App


    Das banze basiert auf Restfulapi, ist aber noch nicht fertig.

    Grüße


    Hannemann

  • Ich habe heute noch mal zwei Filme durchlaufen lassen, die länger sind als zwei Stunden und beide fingen wieder von vorne an, bevor sie zu Ende waren.


    Keine Meldung im Log vorhanden...


    Kann es an der Dateigröße liegen? 2GB Grenze oder sowas?

    Grüße


    Hannemann

  • Moinsen,


    Ich hab am Wochenende mal ordentlich rumgespielt und bin jetzt mit meinem HTML5 Player so weit, das er auf meinen Androiden Live Tv in SD mindestens eine Stunde lang ordentlich abspielt.


    Was mir nicht in den Kopf geht, ist warum das mit Aufnahmen nicht so gut funktionieren will. Nach einigen Minuten behauptet das Log, das der Kommunikationspartner die Verbindung zurückgesetzt hat und beendet den Stream.


    Mit MXPlayer passiert das jedoch nicht daher suche ich nach der Ursache im Android Chrome aber warum funktioniert Live TV? Hast du da vielleicht noch eine Idee?
    Kann ich für einen Test irgendwie verhindern, das der stream und externremux durch streamdev beendet wird? Ich würde gern wissen, ob der Browser dann die Aufnahme weiter abspielen würde.


    Jedenfalls spielt Chrome das Video lange genug ab, das ich in den Vollbilmodus wechseln und dann Chromecasten kann. Der wiederum spielt Serienfolgen mit 20 min länge klaglos ab. Obwohl da laut User Agent auch ein Chrome läuft.

    Grüße


    Hannemann

  • Nabend,


    ich konnte feststellen, das es scheinbar so ist, das der Browser nur eine bestimmte Anzahl an Frames auf einmal herunterlädt. Wird mit mehr als 25 FPS rekodiert, was avconv locker schafft, hört der Browser irgendwann auf Daten abzugreifen und spielt seinen Puffer erstmal leer.
    Streamdev glaubt dann irgendwann, das der Browser wohl kein Interesse mehr an dem Stream hat und schießt den Prozess ab. Das würde auch erklären, warum Aufnahmen nicht laufen, jedoch Live TV.


    Jedenfalls habe ich versucht, das Timeout in server/streamer.c hochzusetzen, was auch wunderbar funktioniert hat zuerst mit 200000... ;)
    Das ist natürlich Humbug (sollte ja auch nur ein Test sein), dennoch wäre ein Timeout größer als 20 Sekunden IMO gar nicht so verkehrt, wenn man das ganze Mobil nutzen möchte und keine anderen negativen Nebenwirkungen hätte, was ich nicht beurteilen kann. Nur so nebenbei...
    So sähe das dannn wohl aus:


    Eine weitere Überlegung war avconv zu verlangsamen, um den Browser zu zwingen permanent herunterzuladen.


    Die Option -re für avconv, die an erster Stelle übergeben werden muss (was nicht der Fall war :wand), sorgt dafür, das nur die tatsächlich benötigte Menge an Frames ausgeliefert wird. Ich nehme an, das es dann auch funktioniert, ohne das Timeout hochzusetzen.

    Code
    avconv -re -i - -threads 2  -filter:v "scale=sar*iw*min(640/iw\,360/ih):ih*min(640/iw\,360/ih), pad=640:360:(640-iw*min(640/iw\,360/ih))/2:(360-ih*min(640/iw\,360/ih))/2"  -c:v libvpx -qmin 0 -qmax 50 -crf 5 -b:v 1024K -deadline realtime -bufsize 128M -c:a libvorbis -b:a 128K -ar 44100 -ac 2 -async 50 -f webm pipe:1


    Nun kann ich meinen zweiten Lösungsansatz gerade nicht testen, da natürlich eine Aufnahme läuft und ich streamdev nicht neu installieren kann. War ja klar...


    Morgen Nachmittag weiß ich dann mehr und werde berichten.

    Grüße


    Hannemann

  • Der Ansatz mit der ffmpeg Option -re ganz vorne funktioniert übrigens. Sorry, hatte ich vergessen, das ich das noch mitteilen wollte. Muss am Urlaub liegen ;P


    Ich baue gerade einen Web Client, der mit dem HTML video Tag und libvpx sowir libvorbis funktioniert. Das läuft auch sehr gut soweit nur das spulen will ja nicht funktionierren. Das finde ich auch nicht weiter schlimm, da ich eigene Kontrollen in das video Tag eingebaut habe, die mir erlauben per timeline an eine bestimmte Stelle zu springen. Man kann auch im Player die Qualität ändern und er macht dann an gleicher Stelle weiter, ähnlich wie bei Plex.


    Wenn ich an eine Stelle springen möchte würde ich gerne ein Bild aus dem Video an dem timestamp via externremux generieren und als poster in das video Tag stopfen, damit man einigermaßen sehen kann wo man hingesprungen ist. Das funktioniert auch schon sehr gut, nur leider beendet sich der Streamer nicht wenn ich mit exit 0 das Script beende. Sollte das nicht so sein?


    Der Browser kann das Bild erst anzeigen, wenn der recstreaming thread beendet ist, was bei HD bis zu 40 Sekunden dauern kann. Bei SD sind es ca. 4 Sekunden.

    Grüße


    Hannemann

  • Sooo.... Ich konnte das Problem umschiffen, indem ich externremux das Bild temporär auf die Platte schreiben lasse und dieses per cat in das FIFO schubse. So kann ich vorher die Größe auslesen und als Content-Length Header mitgeben. Der Browser schließt die Verbindung nach Download des Bildes dann von selbst.


    Wenn ich jetzt zu einem Zeitpunkt springe lädt er in SD innerhalb 200 ms, HD 800 ms den entsprechendnen Frame. Das ist fast wie spulen. Jedenfalls kann ich erkennen, ob die Werbung die ich überspringen will zuende ist :D

    Grüße


    Hannemann

Jetzt mitmachen!

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