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

  • OK, danke Dir!


    Ich warte ab bis deine Erweiterung im Release ist, dann kann ich testen ob (beim ZDF) UHD auswählbar ist und ob das Abspielen der UHD-Videos damit klappt.
    Wenn ich die UHD Videos manuell runter lade, kann ich sie in KODI abspielen.


    Schöne Grüße

    Lothar

    In welchem Release ?

    https://www.minidvblinux.de/forum/

    1x OctopusNet mit 8x DVB-C
    1x Raspberry 4 MLD 6.0 SATIP (softhddevice-drm )

    1x RockPi 4 MLD 6.0 SATIP (softhddevice-drm )

    1x Raspberry 3 als Client MLD 5.4

    1x Raspberry 2 als Client MLD 6.0

    1x Raspberry 1 (staubt gerade so vor sich hin) ;)
    1x Cubietruck

    1x MCC 100
    1x BananaPi

    1x Zotac CI327 MLD 6.0 SATIP (softhddevice)

  • Zabrimus Ich habe mir das Problem mit dem Audio mal angesehen und bin weiter gekommen. Die Ursache ist das du beim Start eines Videos mehrere DeviceClear machst ohne dazwischen Daten zu senden. Dann kommen meine Audio RingBuffer durcheinander und das lösst sich auch nicht mehr auf.

    Der Audio Teil ist noch mehr oder weniger Original von John und da muss ich mal forschen wie das genau mit dem Ringbuffern da funktioniert.

    Letztlich muss ich mit mehreren Clears zurecht kommen.

    Allerdings frage ich mich warum da so viele DeviceClear von dir kommen. Auch bei Pause machst du einen. Ich denke der ist schonmal sicher unnütz.


    Nachtrag:

    Wenn das Videomal läuft dann sind deine Timeouts zu kurz. Änder mal in videocontrol.ccp

    Code
     if (retry_loop_count >= 10) {
                        esyslog("[vdrweb] Error playing ts, abort: %d %d", len, result);
                        tsError = true;
                        return;
                    } else {
                        //dsyslog("[vdrweb] Wait for retrying playTS, loop_count %d", retry_loop_count);
                        retry_loop_count++;
                        std::this_thread::sleep_for(std::chrono::milliseconds(500));

    die Retrys und den wait. Siehe oben.


    Bei dem Audio Problem habe ich auch noch etwas gefunden. Da stört evtl. das close/reopen von alsa. Teste mal mit dem angehängten audio.c

    Da ist debug aktiv und auch ein paar harte prints drin.

  • In welchem Release ?

    Releases · Zabrimus/VDRSternELEC
    Contribute to Zabrimus/VDRSternELEC development by creating an account on GitHub.
    github.com


    Ich habe mir das Problem mit dem Audio mal angesehen und bin weiter gekommen. Die Ursache ist das du beim Start eines Videos mehrere DeviceClear machst ohne dazwischen Daten zu senden. Dann kommen meine Audio RingBuffer durcheinander und das lösst sich auch nicht mehr auf.

    Der Audio Teil ist noch mehr oder weniger Original von John und da muss ich mal forschen wie das genau mit dem Ringbuffern da funktioniert.

    Ahh. Sehr gut. Damit kann ich etwas anfangen und mal schauen, warum der Clear so oft kommt und wie ich das unterbinde. Aus dem SatIP Thread bin ich nicht so richtig schlau geworden.


    Die Werte für die Timeouts sind nur geraten und aus dem Bauch raus definiert. Wird aber jetzt höher gesetzt.


    Deine neue Datei probiere ich aus.

  • Die Ursache ist das du beim Start eines Videos mehrere DeviceClear machst ohne dazwischen Daten zu senden.

    Der Hinweis mit dem DeviceClear und dem Timeout war bombenrichtig :thumbup:


    Ich muss das nochmal ohne deine neue Datei probieren, weil ich nicht weiß, ob deine Änderungen Auswirkungen haben, aber ansonsten läuft das richtig gut :)


    Ich muss nur noch herausfinden, warum der Transcoder manchmal hängt und einen Neustart erfordert.


    Edit:

    Auch noch deine Audio-Änderungen funktioniert es.

  • Hallo Zabrimus,

    ich habe eben von deinem aktuellen Git ein Release CoreELEC-Amlogic-ng.arm-20.3-Nexus für Odroid N2 gebaut und installiert.
    /storage/cefbrowser/data/database/user_agent.ini habe ich für Sat Empfang angepasst:

    Muss ich sonst noch was updaten?

    Code
    [default]
    UserAgent = HbbTV/1.2.1 (+DL+PVR;Samsung;SmartTV2015;T-HKM6DEUC-1490.3;;) OsrTvViewer;Chrome
    
    ; Das Erste
    [S19.2E-1-1019-10301]
    UserAgent = Mozilla/5.0 (Linux; Andr0id 10; BRAVIA 4K VH2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 OPR/46.0.2207.0 OMI/4.21.0.273.DIA6.213 HbbTV/1.5.1 (+DRM; Sony; XR-65X90J; PKG6.5660.0668EUA; ; com.sony.HE.G4.4K; ) sony.hbbtv.tv.G4.2021HE.4K
    
    ; ZDF
    [S19.2E-1-1011-11110]
    UserAgent = Mozilla/5.0 (Linux; Andr0id 10; BRAVIA 4K VH2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 OPR/46.0.2207.0 OMI/4.21.0.273.DIA6.213 HbbTV/1.5.1 (+DRM; Sony; XR-65X90J; PKG6.5660.0668EUA; ; com.sony.HE.G4.4K; ) sony.hbbtv.tv.G4.2021HE.4K

    Leider wird mir bei den Einstellungen weiterhin nur HD und SD angeboten, UHD fehlt. Wenn ich UHD Videos auswähle, sehe ich weiterhin die HD Version.
    Kann ich irgendwo sehen, ob der User-Agent korrekt übergeben wird?
    Folgendes habe ich probiert, aber nichts dazu gefunden:


    Code
    less  /storage/.cache/cefbrowser/cefbrowser.log
    journalctl -u cefbrowser


    Hast Du noch eine Idee?

    Schöne Grüße

    Lothar

  • /storage/cefbrowser/data/database/user_agent.ini

    Ich meine, die Datei müsste nach/storage/.cache/cefbrowser. So ist das zumindest in den install Scripten angelegt.

    Wenn du im journal eine Meldung der Form Configuration file {} not found. Use default UserAgent. nicht bekommst, dann wurde das ini-File richtig gelesen und der UserAgent wird gewechselt. Ich habe gerade noch einen expliziten Log für den UserAgent eingebaut.


    Wenn der UserAgent noch nicht reicht, dann muss es noch eine andere Stelle geben, die für die Auswahl verantwortlich ist.


    In den Javascript-Dateien werden die oipfCapabilities definiert und aktuell sieht es so aus:

    HD, SD, ... Ich fürchte, da muss evt. noch UHD rein. Aber dazu muss ich irgendwas im Internet finden, wie der Eintrag exakt sein muss. Ach und der folgende Code müsste auch angepasst werden.

    Okay. Spezifikation suchen und lesen ist wahrscheinlich angesagt.


    Edit:

    Ich habe die Einträge mal auf gut Glück gemacht, nachdem ich in einer Spec zumindest den richtigen Namen gefunden hatte.

    Damit kann ich in den ZDF Einstellungen auch UHD/HDR wählen. Allerdings habe ich noch keinen Film/Video gefunden, der tatsächlich in UHD geliefert wird.

  • Ja super, das war's!


    Such mal in der ZDF Mediathek nach "Der Schwarm", dann siehst Du den Film in UHD mit HDR.

    Wenn du nach UHD suchst, bekommst du ca. 70 Ergebnisse. Die sind teils in UHD/HDR oder in HD/HDR.


    Die Spec hab ich übrigens auch gefunden, da gibt's auf Seite 128 noch Profile für verschiedene Bild- und Ton-Formate.


    https://www.hbbtv.org/wp-content/uploads/2020/10/HbbTV-SPEC20-00039-027-HbbTV_2_0_1_with_errata_5_integrated-2020-10-14-1.pdf


    Schöne Grüße

    Lothar

  • Such mal in der ZDF Mediathek nach "Der Schwarm", dann siehst Du den Film in UHD mit HDR.

    Da hätte ich auch drauf kommen können :/

    Ich habe im Transcoder noch den Codec hevc in der Config hinzugefügt und damit kommt das auch tatsächlich im VDR an.


    codecs.ini:

    Code
     codec_copy = h264,h265,hevc,mpeg2video

    Das geht besser, als ich dachte.

  • Ich habe die neuste Version mal auf meinem X96 getestet und ARD läuft ganz gut. Aber beim ZDF läuft das Video nicht an (es wird nur das erste Frame gezeigt) und ich habe folgendes im Log:

    Da sieht danach aus als ob es eine Problem mit den cores gibt. Das könnte der ffmpeg sein der alle cores belegt.

    Gibt es für den ffmpeg eine Option nur eine CPU zu nutzen ?

  • Ein anderes mal (ich starte ffmpeg nun mal mit threads=2) bekomme ich folgendes log:

    Da kommt dann ein StopVideo unerwartet. So richtig laufen die Videos noch nicht an :)

  • Gibt es für den ffmpeg eine Option nur eine CPU zu nutzen ?

    Der Transcoder wurde erweitert. In der codecs.ini kann man jetzt die Anzahl der Threads einstellen:

    Code
    [ffmpeg]
    threads = 0

    threads = 0 nutzt die Default-Einstellung von FFmpeg.

    Da kommt dann ein StopVideo unerwartet. So richtig laufen die Videos noch nicht an :)

    Auf dem ZDF? Da schaue ich mir gerade eine Menge Streams an. Seltsam. Geht denn gar kein Stream?


    Kannst du den Transcoder mal mit "-l 3" oder "-l 4" starten. Manchmal geht der FFprobe schief (noch keine Ahnung warum) und dann kommt so eine Meldung: "Duration is empty" oder "Found duration: n/a" oder so ähnlich.

    Dann wird das Video nicht abgespielt. Aber das Problem jage ich noch.

  • Kannst du den Transcoder mal mit "-l 3" oder "-l 4" starten

    Das teste ich dann morgen.


    Mir ist noch aufgefallen das der cefbrowser beim abspielen eines Video einen Last von 6% erzeugt. Ich dachte er ist daran nicht beteiligt. Der remotrans erzeugt dann ca. 12% Last.

    Wenn es nicht klappt (beim ZDF) dann erzeugt der cefbrowser auf allen 4 cores 100% Last und der remotrans erzeugt gar keine Last. Es ist also wohl eher nicht der remotrans der das Problem ist, wie ich mal vermutet hatte.


    Nachtrag:

    Jetzt habe ich gesehen das beim ZDF der ffmpeg wohl falsch gestartet wird:

    Code
    ffprobe -hide_banner -i http://tvdlzdf-a.akamaihd.net/none/zdf/23/11/231113_sendung_1415_dku/1/231113_sendung_1415_dku_6660k_p37v17.mp4

    und beim ARD sieht das so aus:

    Code
    ffmpeg -hide_banner -re -y -referer http://itv.ard.de/ -user_agent HbbTV/1.2.1 (+DL+PVR;Samsung;SmartTV2015;T-HKM6DEUC-1490.3;;) Osr.......

    Die user_agent.ini ist standard, also so wie im GIT.

  • Es finden 2 Aufrufe statt:

    1. FFprobe um die Codecs und Dauer des Videos zu bestimmen und dann

    2. FFmpeg um das Video zu streamen


    Dein ffprobe-Aufruf ist aber nicht der aus dem Log, oder?


    Mit der Lastverteilung stimmt was nicht. So sieht das z.B. bei mir aus, wenn ich streame (N2+)

    So viel schneller kann doch ein S922x gegenüber einem S905x3 nicht sein, oder? Die Hauptlast tragen der VDR und der Transcoder (wie eigentlich auch zu erwarten).


    D.h. irgendwas scheint im Browser falsch zu laufen. Die Last darf der gar nicht haben.


    Ich weiß gar nicht, wo ich ansetzen soll. Ich muss das mal auf der Tanix probieren. Nutzt du die chroot oder native Variante?

  • Dein ffprobe-Aufruf ist aber nicht der aus dem Log, oder?

    Doch, so hing das System und der cefbrowser hatte auf allen 4 cores 100% Last und das Video wurde nicht gestartet.

    Allerdings ist die ffprobe Zeile nicht vollständig, aber der ffprobe blieb hängen. Ich schaue mal ob ich evtl. eine veraltete codec.ini habe.

  • Allerdings ist die ffprobe Zeile nicht vollständig, aber der ffprobe blieb hängen. Ich schaue mal ob ich evtl. eine veraltete codec.ini habe.

    Das Log von ffprobe müsste so etwas sein:

    Code
    std::vector<std::string> callStr {
        "ffprobe", "-hide_banner", "-i", url,
        "-loglevel", "quiet",
        "-referer", referer,
        "-user_agent", userAgent,
        "-headers", "Cookie: " + cookies,
        "-print_format", "csv",
        "-show_entries", "format=duration",
        "-show_entries", "stream=codec_type,codec_name,bit_rate,sample_rate,codec_tag_string,width,height,bit_rate"
    };

    Der Referer, der UserAgent und die Cookies sind notwendig, damit ARD/ZDF da überhaupt vernünftige Werte liefert.

    Die show_entries werden für die gesamte weitere Verarbeitung benötigt.


    Wenn die codecs.ini nicht korrekt ist, dann würde ich die Last (für das echte Transcoding) eher beim Transcoder sehen und nicht beim Browser. Hast du alle 3 Komponenten auf dem aktuellen Stand?

  • Ich habe das Problem nun gefunden. Es liegt an deinem Handling der TCP Verbindungen zw. cefbrowser und remotrans.

    Wenn ich zwischendurch mal einen von beiden durchstarte dann verliert der andere die Verbindung und dann passierte folgendes:

    Der cefbrowrowser sendet ein /Probe (transcoderremoteclient:28) und das kommt auch beim remotrans an. Aber weil die TCP Verbindung zum remotrans nicht neu aufgebaut wurde kommt es beim zurücklesen der Antwort sofort zu einem Fehler (transcoderremoteclient:38) und der cefbrowser denkt das er den remotrans nicht erreicht hat und bricht das streamen ab.

    Der remotrans macht dann zwar den Probe aber die Anwort verliert sich im Nirwana.

    Dein Ansatz ist hier nicht sehr robust. Ich denke du solltest die TCP Verbindung bei jedem Request neu aufbauen und danach wieder abbauen. Dann bleiben auch keine Verbindungen lange offen und können stale werden.

    Das gleiche gilt auch für die Verbindungen zw. web und cefbrowser. Auch da habe ich schon solche Probleme gesehen.

  • Ich habe das nun mal in transcoderremoteclient eingebaut und die TCP Verbindung immer auf und zu gemacht. Das hat aber leider keine Verbesserung gebracht. Hier mal die Logs dazu:

    Code
    Log des CEFBrowsers:
    2023-11-15 14:24:18.761] [cefbrowser] [debug] [browserclient.cpp:360] BrowserClient::OnBeforeBrowse: Url: http://tvdlzdf-a.akamaihd.net/none/zdf/20/01/200114_2015_sendung_zei/4/200114_2015_sendung_zei_3360k_p36v15.mp4, Redirect: false, UserGesture: true
    [2023-11-15 14:24:18.782] [cefbrowser] [debug] [v8handler.cpp:93] V8Handler::Execute: StreamVideo
    [2023-11-15 14:24:23.785] [cefbrowser] [error] [transcoderremoteclient.cpp:41] Http error: Failed to read connection
    [2023-11-15 14:24:23.785] [cefbrowser] [info] [v8handler.cpp:120] --> Video format equal
    [2023-11-15 14:24:23.785] [cefbrowser] [error] [v8handler.cpp:127] Probe failed: Transcoder not available, wrong video URL or another error.


    Wie man in 14:24:23:785 sehen kann kommt der Post schon zurück (mit Fehler) bevor der transcoder das Probe ausführen kann.

    Hier komm ich nicht weiter. Evtl. hast du ja eine Idee.

    Das ganze passiert nachdem ich ein Video angesehen habe und dann ein weiteres starten will. Kein restarts von cefbrowser oder remotrans dazwischen.

  • Ich nutze tatsächlich den httplib::Client nur einmal. Allerdings macht die Lib automatisch einen Reconnect, wenn die Verbindung abgebrochen/beendet wurde:

    https://github.com/Zabrimus/ce…lib.cpp#L4403C24-L4403C24
    Das hätte mich auch gewundert, wenn das nicht klappen würde, so oft, wie ich nur eine der 3 Komponenten durchstarte.


    Auffällig ist diese Zeit

    Code
    [2023-11-15 14:24:18.782] [cefbrowser] [debug] [v8handler.cpp:93] V8Handler::Execute: StreamVideo
    [2023-11-15 14:24:23.785] [cefbrowser] [error] [transcoderremoteclient.cpp:41] Http error: Failed to read connection

    Das sind fast exakt 5 Sekunden. Ich habe ein wenig in der httplib gegraben und das gefunden:

    Code
    #ifndef CPPHTTPLIB_READ_TIMEOUT_SECOND
    #define CPPHTTPLIB_READ_TIMEOUT_SECOND 5
    #endif

    Wenn ich den Code richtig verstehe, dann werden tatsächlich nur 5 Sekunden gewartet, bevor ein Fehler gemeldet wird.


    Kannst du mal prüfen, ob eine Erhöhung des Timeouts Erfolg hat.

    read_timeout.patch.txt


    Edit:

    Das habe ich vergessen zu erwähnen. Der Patch ist für den Browser.

  • Das Problem lässt sich nachstellen. Eine künstliche Pause im Transcoder und der Timeout im Browser lässt den Browser Amok laufen. Ich werde erstmal den Timeout überall erhöhen und dann versuchen herauszufinden, was der Browser da eigentlich macht.

  • Super mit dem grösseren Timeout klappt nun auch endlich das ZDF :)

    Und nun zu einem weiteren kleinen Problem. Vorspulen in ZDF. Da wird der Fortschrittsbalken nicht aktualisiert.

    Das ist echt nur eine kleinigkeit aber für den WAF wichtig. Manchmal bleibt er beim vorspulen auch komplett hängen.

    Ich werde aber nun erstmal produktiv gehen mit dem ganzen :)


    Danke für das tolle Plugin

Jetzt mitmachen!

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