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

  • Zabrimus

    Zwei Dinge sind mir noch aufgefallen.

    1. Wenn man einen Film anschaut und dann auf den Zurück Button geht ( < Zurück) dann kommt das OSD von der Seite davor, aber dann beendet sich das ganze Web und der normale vdr kommt wieder mit laufendem TV Programm.

    2. Der Fortschrittsbalken in einem Film wird nicht richtig angezeigt. Da ist immer ein kompletter weisser Strich (beim ZDF).


    Sind nur Kleinigkeiten :)

  • 1. Wenn man einen Film anschaut und dann auf den Zurück Button geht ( < Zurück) dann kommt das OSD von der Seite davor, aber dann beendet sich das ganze Web und der normale vdr kommt wieder mit laufendem TV Programm.

    Das ist dem Tagesschau-Problem sehr ähnlich. Wenn du die Cursortasten nutzt, taucht das OSD wieder auf. Es fehlt also die perfekte Stelle für den Wechsel Player auf normales OSD und dem Reload.


    Der Fortschrittsbalken in einem Film wird nicht richtig angezeigt. Da ist immer ein kompletter weisser Strich (beim ZDF).

    Ich denke, das liegt daran, daß im <video> Element noch die echte mp4-URL ist und da der Decoder fehlt, kann die Länge wohl nicht bestimmt werden. ZDF schafft es irgendwie sich an meinen Observern vorbeizuschleichen und das <video> Element einzuschmuggeln. Das ist aber auch noch auf meiner TODO-Liste.

  • Mit diesem Aufruf


    Code
    LD_LIBRARY_PATH="/home/rudi/cefbrowser/build/Release/" ./cefbrowser --config /home/rudi/sockets.ini --ozone-platform=headless -q -z 1920

    funktioniert es ganz gut und ich kann weiter testen.


    Zabrimus und jojo61: Mir ist es nicht gelungen, den Start des cef-Browsers und des Transcoders in meine runvdr zu implementieren. Wenn ich die Skripte von einer Shell aus Aufrufe, läuft alles. Wenn ich aber die runvdr vom System des rootfs aus aufrufe (in meiner chroot), laufen weder der cefbrowser (obwohl der Prozess da ist) noch der remotrans (hier ist der Prozess nicht da). Kann das etwas mit den Sockets zu tun haben und wie kann man das Problem lösen? Hat jemand eine Idee?


    Ansonsten läuft das superflüssig unter CoreElec in meiner chroot.


    EDIT: Es sieht so aus, als müsste der VDR zuerst laufen und dann erst der cefbrowser und remotrans. Wenn ich das in meine commands.conf packe, dann funktioniert es, also muss es auch anders gehen.

  • Im Prinzip funktioniert es. Ich habe allerdings häufig folgendes Problem, Zabrimus:


    Manche Filme starten nicht immer. Wenn ich dann das Web-Plugin verlasse und versuche, einen anderen Film zu starten, habe ich Bruchstücke des ersten Films in der Ausgabe. Wenn es funktioniert, wird der Film aber richtig abgespielt. Daher denke ich nicht, dass es am Ausgabeplugin oder am ffmpeg liegt ( jojo61 softhdodroid). Wenn da logs helfen, liefere ich die gerne nach. Der Browser muss dann neu gestartet werden, damit es eine Chance auf Funktionieren gibt. Es funktioniert ca. jeder 6.-7. Versuch. Tagesschau funktioniert übrigens immer.


    jojo61 Ich habe wahrscheinlich wenig Zeit für das Skript in den kommenden Tagen. Ich kann aber ein kleines howtio schreiben, so dass Du Dir das auch einmal native unter der chroot-Umgebung anschauen kannst.

  • Wenn ich dann das Web-Plugin verlasse und versuche, einen anderen Film zu starten, habe ich Bruchstücke des ersten Films in der Ausgabe.

    Das klingt danach, als ob ich noch irgendwo einen DeviceClear() unterbringen muss, damit die Puffer im Ausgabeplugin gelöscht werden. Bei der Tagesschau mache ich das auf jeden Fall bei einem Wechsel des Videos.

    Ich check das.

  • Aktuelle Änderungen im RemoteTranscoder.


    Der Transcoder kennt jetzt den optionalen Parameter "-t" mit dem ein Config-File abgegeben werden kann, in dem erlaubte Codecs angegeben werden können und die FFmpeg transcoding Kommandos für exakt den einen Track.

    Ein Beispiel findet sich in config/codecs.ini:

    Code
    [video]
    codec_copy = h264,h265,mpeg2video
    transcode = libx264 -preset ultrafast -crf 22
    
    [audio]
    codec_copy = ac3,aac,mp2
    transcode = aac
    
    # codec_copy = ac3,aac.48000,mp2
    # transcode = mp2 -b:a 224k

    Video Codecs, die einfach nur kopiert werden sollen (die bevorzugte Variante) sind in diesem Beispiel: h264,h265,mpeg2video. Falls ein Codec gefunden wird, der nicht in der Liste ist, dann soll ein transcoding stattfinden und das entsprechende Kommando ist libx264 -preset ultrafast -crf 22. Also kein -c:v oder ähnliches.


    Die Audio Konfiguration sieht ähnlich aus, hat aber eine zusätzliche Spezialität: Es kann die erlaubte sample_rate mit angegeben werden. Also falls z.B. ein Audio Stream mit aac und sample_rate 41100 reinkommt, aber in codec_copy nur aac.48000 steht, findet ein Transcoding statt. Lässt man die sample_rate weg, dann wird nur der Codec an sich geprüft.


    Ich denke, damit habe ich zumindest die beiden Fälle in diesem Thread berücksichtigt.

    Die Codec-Konfiguration (-t) ist optional und sollte tatsächlich nur eingesetzt werden, wenn es notwendig ist und dann sollten die transcode-Kommandos das Video/Audio möglichst schnell bearbeiten, weil ansonsten der Video-Genuß etwas leiden wird.


    Für das Transcoding bzw. die Parameter bin ich kein Spezialist, aber ich bin ziemlich sicher, daß sich hier im Forum welche damit viel besser auskennen.

    Das Ganze ist bisher nur leicht getestet und kann noch Fehler beinhalten.

  • Danke. Soll ich ein kurzes native-howto hier veröffentlichen oder ist es Dir lieber, es in einen eigenen Thread zu packen? Eigentlich passt es ja hier zum Thema, oder?

    Es passt zum Thema. Allerdings bin ich mir nicht sicher, ob jemand das schnell finden kann, weil der Thread schon groß wird. Aber das ist deine Entscheidung.

  • Wie versprochen, hier ein kleines HOWTO, um alles native in einer chroot-Umgebung auf Amlogic-Boxen zu installieren (getestet auf meinem Radxa Zero).


    1. Mögliche fehlende Pakete installieren


    Code
    apt install -y zlib1g-dev libssl-dev libcrypt-dev libglib2.0-dev libnss3-dev \
    libatk1.0-dev libatk-bridge2.0-dev libcups2-dev libxcomposite-dev libxdamage-dev \
    libxrandr-dev libgbm-dev libxkbcommon-dev libpango1.0-dev libasound2-dev


    Meson aus apt ist zu alt. Daher meson über python3 mit pip3 installieren:


    Code
    pip3 install meson


    Meson liegt danach unter /usr/local/bin/meson


    Code
    apt install ninja-build



    2. Web plugin


    Code
    cd vor/PLUGINS/src
    git clone https://github.com/Zabrimus/vdr-plugin-web web


    Makefile-Zeile ändern (-lrt und -lswscale dazufügen):


    Code
    LDFLAGS += $(shell pkg-config --libs libswscale) -lrt -lswscale


    Code
    make
    make install


    Die Datei sockets.ini an eine Stelle der Wahl kopieren


    Code
    cp vdr/PLUGINS/src/web/config/sockets.ini /home/rudi/sockets.ini


    und überall die IP-Adresse des eigenen Rechners eintragen. Bei mir sieht das so aus:



    3. Remoteranscode


    Code
    cd /home/rudi
    git clone https://github.com/Zabrimus/remotetranscode --recursive
    cd remotetranscode
    /usr/local/bin/meson setup build
    cd build
    /usr/local/bin/meson compile -j1
    /usr/local/bin/meson install


    Das -j1 ist wichtig, da das kompilieren sonst mit einem fatal error abbricht (zu wenig Speicher).


    Ich kopiere remotrans und den movie-Ordner nach root (/), es kann aber auch da liegen bleiben, wo es jetzt ist


    Code
    cp remotrans /
    cp -r movie /


    Das erspart mir später im Skript, das Verzeichnis zu wechseln und die Root-Umgebung ist automatisch gesetzt.


    4. cefbrowser (quick and dirty!)


    Code
    cd /home/rudi
    git clone https://github.com/Zabrimus/cefbrowser --recursive
    cd cefbrowser
    ./setup.sh arm64


    Vor dem Kompilieren müssen noch 2 Dateien geändert werden:


    In cefbrowser/subprojects/cef muss die Datei CMakeLists.txt so geändert werden (sonst ist das cmake zu alt)


    Code
    < cmake_minimum_required(VERSION 2.21)
    ---
    > cmake_minimum_required(VERSION 3.21)


    Dann


    Code
    /usr/local/bin/meson setup build


    aufrufen.


    In cefbrowser/build muss die Datei build.ninja geändert werden (-lrt muss dazu, sonst gibt es undefined symbols beim Linken):


    Code
    < command = c++ $ARGS -o $out $in $LINK_ARGS
    ---
    > command = c++ $ARGS -o $out $in $LINK_ARGS -lrt
    Code
    cd build
    /usr/local/bin/meson compile -j1


    bricht mit einem Fehler ab, da die (Cross)-Architektur nicht stimmt. Daher müssen in der Datei build.ninja weitere Änderungen durchgeführt werden. Jedes Vorkommen von -m64 -march=x86-64 muss gelöscht werden. Das kann man mit einem Editor seiner Wahl machen (Search and replace all). Ich weiß, dass das quick&dirty ist. Besser wäre es, das Build-Skript anzupassen.


    Kompilieren erneut starten:


    Code
    /usr/local/bin/meson compile -j1
    /usr/local/bin/meson install



    Wichtig:


    Das web-Plugin muss laufen, bevor cefbrowser und remotrans gestartet werden. Zum Testen empfiehlt es sich, beide Programme in einer separaten Shell zu starten, damit man die Log-Ausgaben sieht.

    Falls alles läuft, kann man das in ein Skript packen. Ich starte in meiner runvdr ein Skript namens hbbtv.sh so


    Code
    /home/rudi/hbbtv.sh &


    Das Skript hbbtv.sh sieht so aus:


    Bash
    #!/bin/bash
    timeout 30 sh -c 'until nc -z $0 $1; do sleep 1; done' localhost 6419
    # Start cef browser and remotrans here
    at -f /home/rudi/starte_cef.sh now
    at -f /home/rudi/starte_remotrans.sh now


    Wichtig ist, dass der atd-Daemon läuft (mit atd starten in der runvdr).


    Die beiden weiteren Skripte sehen so aus:

    starte_cef.sh:

    Bash
    #!/bin/bash
    killall cefbrowser
    cd /home/rudi/cefbrowser/build/Release/
    LD_LIBRARY_PATH=/home/rudi/cefbrowser/build/Release ./cefbrowser --config /home/rudi/sockets.ini --ozone-platform=headless -f -z 1920


    Und starte_remotrans.sh so:

    Bash
    #!/bin/bash
    killall remotrans
    /remotrans -c /home/rudi/sockets.ini


    Das killall habe ich dazugesagt, da ich dann bequem von der VDR commands.conf aus den Browser oder remotrans neu starten kann.

    Die Einträge in der commands.conf sehen bei mir so aus:


    Code
    Starte CEF-Browser : at -f /home/rudi/starte_cef.sh now
    Starte remotrans : at -f /home/rudi/starte_remotrans.sh now


    Danke nochmal an Zabrimus für dieses tolle Projekt.

  • Beim Ton scheint es zu funktionieren, beim Video noch nicht so richtig.

    Wenn ich beim ZDF ein Video schauen möchte, dann transcodiert er das Video nicht. Beim ZDF ist das Video in AVC1, und das müsste konvertiert werden.

    Meine codec.ini sieht so aus:

    Code
    cat ../config/codecs-1.ini 
    [video]
    codec_copy = h264,mpeg2video
    transcode = libx264 -preset ultrafast -crf 22
    
    [audio]
    codec_copy = ac3,mp2
    transcode = mp2 -b:a 224k


    Grüße

    kamel5

    VDR 2.7.3: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 40 Kernel 6.11 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Teil 2 wegen 10000 Zeichen Limit:


    Außerdem habe ich damit Probleme beim Vor- und Zurückspulen im Video. Beim ersten ">>" oder "<<" scheint sich transcode aufzuhängen, den nur durch einen Neustart funktionieren danach Videos wieder.


    Anbei das Log:

    Mit meinem ursprünglichen Hack funktionierte das Vor-und Zurückspulen.


    Grüße

    kamel5

    VDR 2.7.3: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 40 Kernel 6.11 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

    Edited once, last by kamel5 ().

  • Warum muss avc1 noch konvertiert werden? Das ist doch auch h264, oder habe ich da was nicht verstanden? Im Transcoder wird nur der Codec geprüft. Fehlt da noch ein Kriterium?


    Das Spulen sieht nicht gut aus, da ist auf jeden Fall was falsch

    -map 0:v:1 -c:v:1 copy -map 0:a:1

    Es sind doch nur jeweils ein Audio- und ein Videostream vorhanden


    Edit:
    Spulen sollte jetzt funktionieren

  • Warum muss avc1 noch konvertiert werden?

    Weil das z.B. die TT6400 nicht kann. Die Karte kann nur die codec h264 und mpeg2. Der Container h264 kann natürlich auch andere Codecs enthalten.

    So intensiv habe ich mich mit diesem Thema aber auch noch nicht beschäftigt.

    Es sind doch nur jeweils ein Audio- und ein Videostream vorhanden

    Zumindest bei meinen Tests war das so. Ob das immer so ist ???


    Grüße

    kamel5

    VDR 2.7.3: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 40 Kernel 6.11 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

    Edited once, last by kamel5 ().

  • Auf die Schnelle gefunden:

    creativecow.net/forums/thread/avc1-vs-h264/

    Im Prinzip ist das schon h264, aber mit einem anderen internen Aufbau des Streams.

    Ich weis allerdings nicht, ob das die Karte prinzipiell nicht kann, oder ob das damals nicht mehr in den Treiber integriert wurde. Das macht aber auch nichts, man muss dann halt konvertieren.

    Bei der ARD-Mediathek muss z.B. nicht konvertiert werden, die scheinen das richtige Format zu übertragen.


    Grüße

    kamel5

    VDR 2.7.3: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 40 Kernel 6.11 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Der Container h264

    h264 ist ein Codec und kein Container, das sind z.B. mp4, mkv und mpegts


    vdr-User-# 755 to_h264 chk_r vdr-transcode github

  • Zabrimus ,


    kannst Du Dir den angehängten Patch mal ansehen.


    Ich hatte ja bisher bei der Tagesschau auch das Problem, das es beim Starten mal zwischendurch Schwarz wurde.

    Das liegt an dem Restart OSD in StartVideo. Mit dem Verschieben nach StopVideo tritt das nicht mehr auf. In StopVideo wird es aber gebraucht, da es sonst einen segfault gibt, außerdem wird dort sowieso ein "switching to channel" gemacht, was dann etwas dauert.


    Im Prinzip kann man sich dadurch auch das mit commit f45ce581 eingeführte ReloadOSD() wieder sparen, das schadet aber auch nicht.


    Grüße

    kamel5

  • Und wenn ich einmal dabei bin.


    Der folgende Patch sorgt dafür, das das Ausgabedevice abgefragt wird, ob es das Video skalieren kann, und wenn ja, passt es die Videogröße an das vorgegebene Fenster an.


    Außerdem wird beim Beenden des Plugins das Video wieder zu Vollbild gemacht (den Fall hatte ich auch schon mal, das dann ein skaliertes Video übrig blieb).


    Grüße

    kamel5

Participate now!

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