web (HbbTV, VDR*ELEC), Milestone 1 erreicht

  • Hallo Zabrimus,


    fällt da auch ein Patch für die PC User ab (Einfrierende Bedienung bei Video wiederhabe)?


    Gruß

    Murry

  • fällt da auch ein Patch für die PC User ab (Einfrierende Bedienung bei Video wiederhabe)?

    Was genau meinst du denn? Ich entwickle das Ganze unter einem normalen PC und die Bedienung sollte eigentlich funktionieren. Wobei man schon sagen muss, daß fast hauptsächlich mit den Cursor-Tasten, OK und den Farbtasten navigiert bzw. bedient wird. Auch bei der Videowiedergabe wird ein OSD aus der Page eingeblendet.

  • War bisher nur per Fernzugriff drauf. Es crasht nicht und alles scheint zu laufen, aber vor dem TV konnte ich es noch nicht testen...

    Wenn das läuft, sollte man sich überlegen, wie man cefbrowser mit VE verteilt, weil das image ganz schön aufgeblasen wird. Ich konnte es wegen der größe gar nicht erzeugen....

  • Wenn das läuft, sollte man sich überlegen, wie man cefbrowser mit VE verteilt, weil das image ganz schön aufgeblasen wird. Ich konnte es wegen der größe gar nicht erzeugen....

    Das habe ich mir schon gedacht und es deshalb nicht versucht. Aus genau dem Grund baue ich den cefbrowser extern per Github Workflow und lasse auch da die Binaries in die Releases hochladen (armhf, arm64 und amd64).

    Ich könnte mir ein Setup-Script vorstellen (mit/ohne Docker., CE/LE), das den Browser runterlädt und alles soweit einrichtet, wie es geht.

  • Bin noch nicht dazugekommen, es zu testen. Kennst du dich mit der Bereitstellung und Installation von Addons aus? Ich denke, die cef binaries müssen in jedem Fall vom Image getrennt werden und separat zu installieren sein. Sonst wird das Image zu groß. Evtl. wäre da der richtige Weg über ein Addon...

  • Bin noch nicht dazugekommen, es zu testen. Kennst du dich mit der Bereitstellung und Installation von Addons aus?

    Nicht wirklich. Ich habe bisher nur die package.mk von Addons gesehen, mir aber dazu keine weiteren Gedanken gemacht. Geschweige denn habe ich eine Ahnung, wie die Addons überhaupt bereitgestellt werden.

  • Ich werde jetzt erst testen wie es mit den aktuellen Versionen läuft und schau mir dann die addon Sache an. Ich glaube, das muss man nur einmal verstanden haben und dann wäre das das richtige für cefbrowser.

  • So, kurzer Testbericht. Ganz kurz ;)


    Auf VDR*ELEC installiert, also über dessen build system. Allerdings dann manuell an die richtigen Stellen kopiert.

    Alles startet. Im VDR klicke ich den Menüpunkt Web an, dann kommt rechts unten das Infofenster. Ich drücke die rote Taste und das Video wird wunderbar mit dem Startbildschirm überblendet. Ich kann dann auch links und rechts scrollen, aber sobalb ich was antippe, steigt vdr aus. Mit einem abort im softhddevice-drm-gles plugin. Vielleicht mag er die Videogröße 1x1 nicht... Teste mal ein anderes.


    EDIT: Mit softhddevice-drm gibts gar einen segfault. Ich schau mir das Ausgabeplugin mal an.

    Aber das Plugin könnte krass cool werden, wenns stabil läuft! Sieht sehr vielversprechend aus!

    Einmal editiert, zuletzt von rell ()

  • Ich bin ja froh, wenn es läuft :) Also nativ auf LE ohne Docker und so?


    Vielleicht mag er die Videogröße 1x1 nicht

    1x1? So ein Mist :( Ich fange schon 0x0 ab und übergebe das nicht dem VDR.

    Warum das passiert ist mir nicht klar. Im Javascript-Code bestimme ich die Größe und Koordinaten des <video>-Tags und übergebe die Werte an VDR, damit das TV-Bild richtig skaliert und positioniert wird.

    Es scheint, als ob die Berechnung zu früh oder zu einem falschen Zeitpunkt stattfindet, wenn das <video>-Tag noch nicht richtig positioniert ist. Die Seiten werden z.T. hochdynamisch per Javascript permanent verändert.


    Ich werde die Prüfung erweitern. Video-Size mit zu kleinen Werten scheinen mir überhaupt nicht sinnvoll zu sein.

  • Ohne Docker. Wie man den cefbrowser am besten verteilt, muss ich mir mal überlegen.


    Werds wieder testen, aber trotzdem sollte das Ausgabeplugin nicht gleich aussteigen.

  • add cefbrowser as an extra · rellla/VDRSternELEC@8f07d4d
    Signed-off-by: Andreas Baierl <ichgeh@imkreisrum.de>
    github.com


    So baut das hier für arm, arm64 und x86. Allerdings nur _cefbrowser als einzelnes Paket und nicht das Image. Da muss man erstmal etwas tricksen und das cef-Zeug manuell kopieren, dann beim Image bauen die großen libs nicht mehr kopieren.


    Nicht optimal, aber immerhin.

  • Weiter gehts. Musste das "-y" hier entfernen, das kennt mein ffprobe nicht.

    Durch die Menüs scrollen funktioniert. Es wird jetzt auch das Video abgespielt - allerdings verschwindet die Browseroberfläche nicht und ich höre nur Ton.

    Kann jetzt wieder am Ausgabeplugin liegen - oder aber hier muss noch was gelöscht werden. Ideen?


    Gruß

    Andreas

  • Weiter gehts. Musste das "-y" hier entfernen, das kennt mein ffprobe nicht.

    Durch die Menüs scrollen funktioniert. Es wird jetzt auch das Video abgespielt - allerdings verschwindet die Browseroberfläche nicht und ich höre nur Ton.

    Kann jetzt wieder am Ausgabeplugin liegen - oder aber hier muss noch was gelöscht werden. Ideen?

    Die Oberfläche ist ein steter Kampf mit der HTML-Seite. Welchen Sender hast du denn getestet? Das liegt fast (eigentlich) nie am Ausgabeplugin.

    Innerhalb der Seite muss noch irgendwas ausgeblendet (visibility:hidden) werden. Dem Browser fehlen die Codecs um Videos abzuspielen, also musste die Trennung Seite/Video her. Normalerweise liegt das Video in der Ebene zwischen den Navigationsbuttons und dem Hintergrund. Nur ohne Video ist der Hintergrund permanent sichtbar und muss ausgeblendet werden.

    Und das ist der ätzende Part der ganzen Arbeit. Im HTML-/Javascript-Code suchen, was und wie etwas ausgeblendet werden kann. Ohne den Chrome-Debugger hat man gar keine Chance.


    Dem Browser wird ein Dummy-Video untergeschoben (statt dem eigentlichen), damit die Laufzeit und alles andere genauso funktioniert, wie das echte Video. Das Dummy-Video ist nur ein sehr kleines transparentes Video. Ich hatte schon versucht noch ein Bild (eine eindeutige Farbe) über das Video-Tag zu legen und dann die Pixel mit der eindeutigen Farbe nach transparent zu ändern. Aber die Seiten verwenden auch den Alpha-Channel für ihre Bilder und das sieht dann echt interessant bis gruselig aus, weil ich die Pixel nicht mehr eindeutig identifizieren kann.

  • Den Workflow der ganzen Sache habe ich noch nicht ganz durchblickt:

    -> cefbrowser holt sich die ganzen Seiten und gibt das "OSD" der Anbieter als Bitmap an vdr-plugin-web weiter, das es dann als Bitmap auf eine OSD-Pixmap zeichnet und darstellt

    -> cefbrowser holt sich das Video, lässt es vom transcoder umwandeln und schickt es als Stream an vdr-plugin-web, das es wie einen VDR-Stream darstellt


    Wäre das richtig?


    Bei softhddevice-drm-gles muss man wissen, dass das Video hardwarebedingt immer unter dem OSD liegt. Also sobald ein OSD in einem Bereich gezeichnet wird bzw. aktiv ist, unter dem ein Video liegt, sieht man das Video nicht mehr. Man muss jetzt entweder im Bereich des Videofensters (wenn es nicht fullscreen ist) ein transparentes Rechteck ins OSD zeichnen oder den Bereich erst gar nicht darstellen lassen. Oder man deaktiviert es. Wenn ein Fullscreen-Video mit Steuersymbolen, Infos etc. überblendet werden soll, ist es genauso. Der Bereich, wo das Video sichtbar sein soll, muss transparent sein. Ich weiß nicht, ob andere Ausgabedevices das OSD mit dem Video überlagern können und ob das überhaupt der Grund ist, warum ich kein Video sehe.

    Ich vermisse im Log Einträge, die das OSD wieder ausschalten. Falls das nicht möglich ist, und immer ein OSD gezeichnet wird, muss das Bitmap schon die Transparenz haben. WebOSDPage::Hide ist z.B. noch nicht implementiert, wird aber auch nicht aufgerufen. Auch nicht WebOSDPage::~WebOSDPage(), wenn ich es von gestern richtig in Erinnerung habe.


    Es war gestern so, dass ich eine Sendung, z.B. Tagesschau direkt angewählt habe, Ton kam aber ich habe nur den blauen Hintergrund mit "ARD Mediathek" (glaube ich) gesehen. Es wird also abgespielt, nur liegt m.E. das OSD darüber.


    Evtl. bin ich aber auch auf dem Holzweg...


    Gruß

    Andreas

  • Cefbrowser rendert die HTML-Seiten (HbbTV ist auch nix anderes als HTML5).

    Dabei gibt es 1-Special Element, daß für TV-Darstellung und das Video verantwortlich ist:

    <object id="video" type="video/broadcast" style"..."></object>

    Und falls es ein Video ist, dann ändert sich der type auf z.B. video/mp4.

    Wird video/broadcast erkannt, dann lege ich einen div-layer exakt über das <object> mit z-index 999. Der div-layer hat nur eine einzige Farbe, von der ich hoffe, daß sie nicht so oft vorkommt und sie wurde rein zufällig gewählt: rgb(254,46,154) = #fe2e9a.

    Alle sichtbaren Änderungen landen als Bitmap in BrowserClient::OnPaint. Die Bitmap wird im shared memory gespeichert und VDR erhält die Nachricht, daß es etwas neues zur Darstellung gibt.

    Vorher wird für alle Pixel mit der Spezialfarbe (s.o) in der Methode die Farbe des Pixels auf Voll-Transparent gesetzt.

    Damit wird erreicht, daß im VDR an der Stelle, an der das TV-Bild sichtbar sein soll, das OSD transparent ist.


    Im VDR gibt es das WebOSDObject, daß 2 Funktionen erfüllt:

    1. Als reines OSD, daß über das Menu aktiviert wird

    2. Als Control (OSD) für den Videoplayer

    Für das OSD habe ich Plugin den Layer OSD_LEVEL_SUBTITLES(10) gewählt, weil der irgendwie passend war.


    Das OSD selbst wird künstlich offen gehalten, damit VDR dieses nicht nach einer bestimmten Zeit schliesst. Das würde sich mit dem Browser bzw. der Funktionalität der Seite beissen. Das OSD wird also nie selbstständig geschlossen. Drückt man aber z.B. die Menu-Taste, dann verschwindet auch das OSD und alles hat seinen Ursprungszustand.


    Soll ein Video dargestellt werden (siehe object Tag oben, type z.B. video/mp4), dann fange ich die URL ab und ändere sie auf ein eigenes transparentes video/webm, für das der Browser einen Codec hat.

    Die ursprüngliche URL wird an den Transcoder gesendet, der daraus ein mpeg-ts macht und die TS-Pakete landen über den Umweg Browser im VDR im Player und das Video wird abgespielt.


    Das Control des Players (WebOSDPage) selbst stellt weiterhin alles dar, was der Browser so sichtbar anbietet. Normalerweise werden während des Videos alle sichtbaren Elemente in der HTML-Seite ausgeblendet und damit ist das OSD im VDR auch volltransparent. Drückt man eine Taste, dann werden in der Seite die Controls gerendert und im VDR auch wieder dargestellt. Das ist eine Funtionalität, die die Sender selbst bereitstellen.


    Das Plugin selbst macht nichts anderes, als darstellen (Video, OSD) und Tastendrücke an den Browser senden.


    Die HbbTV-Seiten haben im Wesentlichen 3 Layer:

    - Hintergrund

    - Video

    - Controls/Andere Informationen

    Das Video ist transparent und nicht wirklich sichtbar. Die Controls will ich haben, weil z.B. Pause, Stop, Laufzeit und Programminformationen eingeblendet werden.

    Jetzt passiert dummerweise das sehr Unangenehme: Der Hintergrund wird auf verschiedenen Sendern nicht ausgeblendet, weil die davon ausgehen, daß das Video den Hintergrund sowieso verdeckt. Aber leider funktioniert das nicht mit der hier beschriebenen Lösung. Der Hintergrund wird also weiter im OSD sichtbar sein und ich muss versuchen den künstlich zu verstecken.

    Dazu gibt es das Java-Script static-content/js/video_quirks.js mit dem ich versuche den Hintergrund bei Videostart zu verstecken und beim Ende wieder zu aktivieren.


    Was sehr einfach geht, wäre das overlay-Div (siehe oben) über die ganze Seite zu ziehen, dann wäre das Video immer sichtbar, egal wo. Oder auch direkt im BrowserClient::OnPaint beim Videoabspielen alles transparent macht. Allerdings würde man dann auf jeden Control/jede Information verzichten müssen. Das finde ich auch nur schwach überzeugend und hat bei mir bisher nur geringe Akzeptanz. Aber wenn es gar nicht anders geht... Die Frage ist natürlich, was wichtiger ist und worauf man verzichten kann oder weitere Arbeit investiert.


    Mit ARD/ZDF hatte ich bisher die wenigsten Probleme und ich hätte auch erwartet, daß es da am Besten funktioniert. Zumal die beiden Sender meine Haupt-Testsender sind.


    Hast Du die Tageschau über die Mediathek ausgewählt? Hast du mal ein "echtes" Video probiert? Ich versuche herauszufinden, wie ich das Problem nachstellen kann.


    Probleme (meine aktuellen TODOs):

    Prio 1:

    Ich hatte aufgrund des segfaults im VDR das Handling der WebOSDPage und des Players geändert. Jetzt tritt der segfault nicht mehr so auf, allerdings bin ich über den aktuellen Stand nicht sehr glücklich, weil es eigentlich eine Verschlechterung ist :( Es gefiel mir vorher viel besser (wenn der VDR nicht abgestürzt wäre).


    2. Versuchen, das Abspielen des Videos immer komfortabel zu halten ohne große Ausnahmen und Spezialbehandlungen (siehe obige Problematik mit dem Hintergrund)


    3. Manchmal passiert es, daß die Video-URL nicht durch das eigene webm ersetzt wird. Die Konsequenz ist: Werbung wird abgespielt, Film soll laufen und dekodiert nicht, Werbung fängt von vorne an. Sehr nervig.


    4. In der ZDF Mediathek wurde heute ein TS-Stream der Tour de France angeboten, der im Transcoder so gar nicht funktioniert hat und der Transcoder ist abgeschmiert. Analyse steht noch aus.


    Ich glaube, das war es erstmal :)

  • Jetzt passiert dummerweise das sehr Unangenehme: Der Hintergrund wird auf verschiedenen Sendern nicht ausgeblendet, weil die davon ausgehen, daß das Video den Hintergrund sowieso verdeckt. Aber leider funktioniert das nicht mit der hier beschriebenen Lösung. Der Hintergrund wird also weiter im OSD sichtbar sein und ich muss versuchen den künstlich zu verstecken.

    Dazu gibt es das Java-Script static-content/js/video_quirks.js mit dem ich versuche den Hintergrund bei Videostart zu verstecken und beim Ende wieder zu aktivieren.

    Ich glaube, das ist mein Problem, nämlich dass der Hintergrund den Rest überdeckt.


    Liefern die Sender denn den Hintergrund und die Overlays separat aus? Bzw. kann man das im cefbrowser auseinandertüfteln und separat an vdr-plugin-web weitergeben?

    Falls ja, kennt ja das vdr-plugin-web die Lage und Größe des Videos und könnte den Teil aus dem Hintergrund löschen und dann Hintergrund, Video und Overlay zeichnen.


    Das klappt aber nur, wenn man die Möglichkeit hat, Hintergrund und Overlay auf 2 verschiedenen Layern zu bekommen.

  • Falls ja, kennt ja das vdr-plugin-web die Lage und Größe des Videos und könnte den Teil aus dem Hintergrund löschen und dann Hintergrund, Video und Overlay zeichnen.

    Die Lage und Größe des Videos bestimme ich schon und die Information wird auch an den VDR gesendet.

    Stimmen die Daten der Videosize im VDR Log denn so pi x Daumen?

    Du redest von der Tageschau-Seite, bei der die einzelnen Videos oben rechts dargestellt werden?


    Im Chome-Debugger kann man schön sehen, daß der Bereich in dem das Video dargestellt werden soll eine spezielle Farbe hat. Diese wird dann im Browerclient::OnPaint auf transparent gesetzt und das Video sollte genau da sichtbar sein.



    Ansonsten macht jede Seite ihr eigenes Ding mit HTML und Javascript. Es gibt da keinen einheitlichen Standard.

    Die folgenden Sendergruppen nutzen dabei ein gemeinsames Layout/Framework:

    - ARD

    - ZDF

    - Pro7/Sat1

    - RTL

    Arte hat bisher den größten Aufwand getrieben um zu allem irgendwie kompatibel zu sein und immer zu funktionieren.


    Meinen Browser starte ich lokal so:

    ./cefbrowser -l 4 --config=sockets.ini --remote-allow-origins=http://localhost:9222

    und dann komme ich im Chrome mit "http://localhost:9222/" auf den Debugger und kann alles untersuchen. U.a. auch, was der Browser in echt darstellt und somit an den VDR gesendet wird - abzüglich des Bereichs, der transparent werden soll.


    Ich habe den Test-Code in WebOSDPage::drawImage leider schon gelöscht. Es gab irgendwann mal die Möglichkeit, alle Images bzw. den Speicherblock in ein File zu schreiben und dann das rgba/argb/bgra (ich kann mir die Reihenfolge der Farben und des Alpha Channels einfach nicht merken) umzuwandeln, um zu sehen, was im VDR eigentlich ankommt.

Jetzt mitmachen!

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