StreamServerSeek - Video On Demand for the streamserver

  • Mit diesem Plugin kann man Aufnahmen und andere Filme ganz einfach über den Streamserver schauen und diese Steuern. Weiterhin bringt die Benutzung des integrierten Reverse-Proxies einen Geschwindigkeitsvorteil, wenn man per HLS in langsamen Netzen streamed (bspw. über das Internet).


    Um Aufnahmen/Filmen per Browser, abzuspielen einfach im Web-Interface unter "Filme" auf den Play-Button klicken.


    Im Moment muss man noch manuell libsss-segment installieren. Ab dem nächsten Update liegt diese aber auch auf dem DMM-Feed.


    Da eine alte Version von StreamServerSeek auf dem Feed liegt, sollte man nach der Installation folgenden Befehl ausführen, damit eine Version aus diesem Thread bei einer System-Aktualisierung nicht überschrieben wird:


    apt-mark hold enigma2-plugin-extensions-streamserverseek


    Um das später wieder rückgängig zu machen und Versionen über den Feed zu aktualisieren:


    apt-mark unhold enigma2-plugin-extensions-streamserverseek



    Zum Streamen von Aufnahmen/Filmen in einem anderen beliebigen Clients ruft man nicht mehr den Streamserver direkt auf, sondern http://[IP]/streamserverseek/stream/[PROTOCOL][FILENAME]
    PROTOCOL ist dabei entweder "rtsp" oder "hls". [FILENAME] entspricht dem Pfad zum Film.


    Möchte man also bspw. den Film /media/hdd/movie/dateiname.ts per RTSP streamen, ist die Url: http://[IP]/streamserverseek/stream/rtsp/media/hdd/movie/dateiname.ts


    Wenn man direkt zu einer bestimmten Minute springen, hängt man an die URL einfach "?min=X" an. Wobei X der gewünschten Minute entspricht.


    Möchte man also bspw. den Film /media/hdd/movie/MeinFilm.mkv per HLS streamen und direkt zu Minute 30 springen, ist die Url: http://[IP]/streamserverseek/stream/hls/media/hdd/movie/MeinFilm.mkv?min=30


    Analog dazu kann direkt in den Web-Player springen, indem man http://[IP]/streamserverseek/stream/player/media/hdd/movie/MeinFilm.mkv aufruft. Am einfachsten ist es, den gewünschten Film einfach in der Standard Film-Liste unter http://[IP]/#!/movies/list/filter// zu starten. Der Play-Button startet automatisch Dreambox TV und spielt den gewünschten Film ab.


    Ein über /streamserverseek/stream/hls/... oder /streamserverseek/stream/player/... gestarteter Film läuft automatisch über den integrierten Reverse-Proxy!


    StreamServerSeek kann leider aktuell nur Aufnahmen (.ts Dateien) im Hintergrund abspielen. Um auch .avi/.mkv/usw. im Hintergrund über den Streamserver streamen zu können, fehlt noch eine Funktionalität im enigma2-core. Einen Feature Request dafür habe ich erstellt Mit gstreamer decodete Filme an encoder - aber ob und wann dieser umgesetzt wird, ist ungewiss. Trotzdem können solche Filme mit StreamServerSeek abgespielt werden:


    In StreamServerSeek ist ein "temporärer Live-Mode" enthalten, der die Server-Box temporär aus dem Idle aufweckt, den Film startet und im Anschluss wieder in den Idle wechselt. StreamServerSeek achtet dabei darauf, dass der normale Betrieb der Box durch den temporären Live-Mode nicht gestört wird. D.h. das Abspielen solcher Filme funktioniert nur, wenn die Box gerade im Idle ist. Außerdem wird der temporäre Live-Mode sofort beendet, wenn jemand an der Server-Box manuell den Service wechselt, oder diese in Idle versetzt. Andernfalls wird der Film bis zum Ende gespielt und danach automatisch der temporäre Live-Mode beendet und die Box wieder in den Idle geschickt. Auch wenn 30 Sekunden lang keine Clients mehr mit dem Streamserver verbunden sind, wird der temporäre Live-Mode automatisch beendet und die Box wieder in Idle versetzt.
    Während des temporären Live-Modes wird HDMI-CEC deaktiviert. Der TV sollte also nicht automatisch mit angehen!


    StreamServerSeek erkennt automatisch, ob es sich um eine Aufnahme oder um einen Film handelt, für den der temporäre Live-Mode erforderlich ist. Handelt es sich lediglich um eine Aufnahme (.ts Datei), dann kann diese im Hintergrund gestreamed werden und die Box somit während dessen normal benutzt werden.


    Der Reverse-Proxy kann auch zum Streamen von normalen TV-Kanälen benutzt werden. Hierzu benutzt man statt http://[IP]:8080/stream.m3u8?ref=... einfach die URL http://[IP]/streamserverseek/proxy/stream.m3u8?ref=...


    Um den Stream zu steuern, stellt StreamServerSeek neben der normalen Seek-Bar im Web-Player sowie anderen HLS-Clients ein Web-Interface und eine Web-API bereit.
    Das Web-Interface befindet sich unter http://[IP]/streamserverseek/ und enthält (noch) nur einen Slider zum Ändern der PlayPosition.


    Die Web-API, die unter http://[IP]/streamserverseek/web/[FUNKTION]?[PARAMETER] zu finden ist, stellt deutlich mehr Funktionen bereit:

    • getinfo

      • Liefert state (0 = INACTIVE, 1=BACKGROUND, 2=LIVE), statetext, servicename, servicereference, moviepath, pausable, seekable, length, playposition
      • Parameter:


        • unit (optional): "min" oder "sec"
    • getlength

      • Länge der Aufnahme
      • Parameter:


        • unit (optional): "min" oder "sec"
    • getplayposition


      • Aktuelle Position in der Aufnahme


      • Parameter:


        • unit (optional): "min" oder "sec"
    • pause


      • Pausiert die Wiedergabe
    • unpause


      • Startet die Wiedergabe
    • play


      • Macht das gleiche wie "unpause"
    • seekto


      • Springt zu einer absoluten Position


      • Parameter:

        • pos: Position, zu der gesprungen werden soll
        • unit (optional): "min" oder "sec"
    • seekrelative


      • Springt relativ zur aktuellen Position vor oder zurück.


      • Parameter:

        • pos: Position, zu der gesprungen werden soll. Ein negativer Wert führt zu einem Rückwärtssprung.
        • unit (optional): "min" oder "sec"
    • seekchapter

      • Springt zu einem bestimmten Chapter
      • Parameter:


        • number: Nummer des Chapters
    • fastforward

      • Spult vor
      • Parameter:


        • speed: Geschwindigkeits-Multiplikator
    • fastbackward

      • Spult zurück
      • Parameter:
      • speed: Geschwindigkeits-Multiplikator
    • slowmotion


      • Spielt die Aufnahme langsamer ab


      • Parameter:


        • speed: Geschwindigkeits-Multiplikator







    Beispiele:

    • Zu Minute 60 springen


      • [IP]/streamserverseek/web/seekto?unit=min&pos=60
    • 5 Minuten vorwärts springen


      • [IP]/streamserverseek/web/seekrelative?unit=min&pos=5
    • Video pausieren


      • [IP]/streamserverseek/web/pause
    • Länge in Sekunden ausgeben


      • [IP]/streamserverseek/web/getlength?unit=sec
    • Aktuelle Position in Minuten


      • [IP]/streamserverseek/web/getplayposition?unit=min
    • Mit fünffacher Geschwindigkeit vorspulen


      • [IP]/streamserverseek/web/fastforward?speed=5
    • Video wieder normal abspielen


      • [IP]/streamserverseek/web/unpause oder [IP]/streamserverseek/web/play

    Damit die Api-Funktionen manuell im Browser aufgerufen werden können, müssen folgende Einstellungen unter Einstellungen -> Netzwerk -> Webinterface auf "aus" gestellt werden:

    • Einfache Anti-Hijack Maßnahmen
    • Token-basierte Sicherheit

    Das sollte man aber nur machen, wenn das Webinterface definitiv nicht von außen zu erreichen ist. Zur Sicherheit im internen Netzwerk sollte man dann evtl. über ein Passwort für das Webinterface nachdenken. Wenn ich dazu komme, erstelle ich noch eine einfache Weboberfläche, damit die Api auch ohne die Deaktivierung der Sicherheits-Funktionen im Browser benutzbar ist.

  • Naja wenn Du das Plugin installierst, sieht es nach außen sonaus, als wenn das direkt im dreamliveserver integriert ist. Kann also theoretisch in Clients integriert werden. Praktischer wäre es natürlich echt, wenn das von DMM direkt in StreamServerControl.py übernommen wird. Aber ob und wie das passiert, werden wir sehen.
    Aber es gibt sauberere Wege das noch viel besser hinzubekommen. Bspw. das Webinterface um Api Funktionen erweitern, womit man im laufenden Stream vor/zurückspulen und seeken, pause/resume usw. kann. Vllt mache ich sowas mal, wenn ich Zeit und Lust habe.

  • @maluhi: Sollen wir dein Plugin auf github mit unterbringen?
    Ich weiß jetzt nicht ob du selbst im umgang mit git schon Erfahrung hast, aber mich freuts immer wenn Leute was bauen und ich finde es etwas schade wenn es dann nur über Foren zu finden ist.
    Solltest du selbst gar keine Lust auf git haben kann ich das auch übernehmen.


    Ansonsten hat github nen wirklich guten Desktop-Client mit dem im prinzip jeder recht schnell git nutzen kann.

  • Ja, gerne. Habe seit Jahren viel Erfahrung mit git auf privaten repositories, aber mir letztens auch einen github account angelegt: https://github.com/maluhi
    Du hast übrigens vor kurzem bereits einen Pull Request von mir in partnerbox gemerged. :)


    Wie läuft das jetzt am besten? Packe ich das Plugin analog zu den anderen Plugins einfach in meinen lokalen Fork und pushe, nachder Rechtevergabe, in euer repo? Oder soll ich das in meinem Fork machen und Du schaust erst nochmal drüber? Oder erstellst Du das Grundgerüst mit dem bestehenden Code und ich übernehme dann nachher nur die Pflege?

  • Ich hab dich eben zu opendreambox Plugin-Developers eingeladen!
    Mach dein Ding gerne direkt im opendreambox repo.
    Ich möchte dir da jetzt garnicht reinfunken.
    Was du bisher so gemacht sah immer gut aus deshalb hab ich auch nichts dagegen wenn ich mich da etwas raushalten kann/darf.


    Wenn du mal mit irgendwas Hilfe brauchst stehen wir natürlich immer zur Verfügung!

  • Danke! Ich habe den Initial Commit jetzt in euer repo gepushed.
    Vorher hatte ich noch in einer lokalen OE build umgebung und meinem fork getestet, ob das Paket richtig gebaut wird. War auch ganz gut so, denn ich hatte Depends auf "dreamliveserver | dreamrtspserver", das wird allerdings falsch geparsed und ich konnte das Package nicht bauen, weil ein depend auf das Paket "|" erstellt werden sollte. Könnt ihr ja bei Gelegenheit mal fixen, ist aber auch nicht wirklich relevant - habe die depends darauf rausgenommen.


    Wird jetzt jedenfalls richtig gebaut! https://github.com/opendreambo…ec6e0d702486d090523d066b1

  • @maluhi


    Danke teste das ganze mal mit HLS stream auf einen ipad klappt bis jetzt gut .
    Was mir aber auffiel habe ich eine alte url aufgerufen also so wie es ohne deinen StreamServerSeek aussah also ip:8080/stream.m3u8?ref=1%3A0%3A0%3A0%3A0%3A0%3A0%3A0%3A0%3A0%3A%2F%2Fmedia%2Fhdd%2Fmovie... usw. dann crasht die box 2x weg .
    Ist jetzt nicht schlimm man sollte es ja nicht machen :D aber evtl. interessiert dich die info


    erst

    dann kommt noch






    MFG
    KURTI

  • Ist eine Implementierung des Ganzen in DreamDroid technisch denkbar/umsetzbar? Also die Möglichkeit Aufnahmen über die App auch transkodiert anzuschauen?

    Im Prinzip warte ich genau darauf, da ich dann die aktuell nur sehr bedingt schöne VLC Lösung über Board werfen kann und den in android integrierten Player für's streaming verwenden.
    Damit gewinnen wir im prinzip auf ganzer Linie :).

  • Ja, das sollte bereits mit den vorhandenen Api-Funktionen klappen. Ich habe aber trotzdem noch vor diese zu erweitern. Bspw. um eine Status-Funktion, die gesammelt Werte wie sref, name, length, playposition, pausable, seekable zurückgibt, damit man das alles mit einem Aufruf erhält.


    Ich habe da noch ein paar Ideen im Kopf, die ich gern noch umsetzen möchte:


    - Automatischer Wechsel in den LiveTV-Modus, wenn ein avi/mkv abgespielt werden soll. Dazu temporär CEC disablen, damit der TV nicht mitangeht. Das ganze natürlich nur, wenn die Server-Box gerade nicht anderweitig in Verwendung ist.
    - Kleines Webinterface, das Bedienelemente wie Start/Pause, vor/zurückspulen, Schieberegler zum seeken, etc. enthält
    - Eine erweiterung für das Partnerbox-Plugin: Remote-Movie. Quasi ein Dateibrowser, womit man Filme auf der Server-Box encodiert abspielen kann und ganz normal (mit Verzögerung) mit der FB zum pausieren, spulen, etc. bedienen kann.


    Wann und in welcher Reihenfolge ich das umsetze weiss ich moch nicht genau, muss ja auch noch irgendwie Geld verdienen und mich um Freundin und Kids kümmern und so :)

  • Genau das habe ich vor. Es soll ein Erweiterungs-Plugin für Partnerbox werden, also zwar eigenständig sein, aber von Partnerbox abhängen und bspw. die Config mit den Daten der Server-Boxen dort auslesen, damit der User nicht alles doppelt und dreifach konfigurieren und auf Stand halten muss. Wer den RemoteMovie-Player nutzt, nutzt höchtwahrscheinlich auch Partnerbox, dacht ich mir.
    Aber vielleicht mache ich es auch nur so, dass zusätzlich zur eigenen Config auch die bereits bestehenden Partnerboxen, wenn Partnerbox installiert ist, auswählbar sind oder so...