[dash2ts] Stream IPTV/Zattoo mit inputstream-adaptive und widevine

  • Hallo,

    so nun bin ich soweit das ich mal wieder Tester suche. Ich habe einen Streaming Converter geschrieben der mit Hilfe der Kodi inputstream-adaptiv lib einen dash Stream auf mpegts convertiert. Gleichzeitig bedient der inputstream-adaptive auch die widevine lib und dekodiert den Stream.

    Das ganze kann sehr leicht in die IPTV Struktur des VDR intergriert werden. Dazu gibt es im Repository eine Beispiel channels.conf mit den ORF Kanälen. Das eigentlich Programm heisst dash2ts und kann auch ohne den VDR getestet werden.

    Aufruf:

    dash2ts <link_auf_das_manifest.mpd> <portnr> <widevine_token>

    Den widevine token kann man auch weglassen wenn der Stream nicht verschlüsselt ist. Der Stream wird dann auf localhost:portnr per UDP gesendet. Zum testen kann man sich das dann z.b. mit "mpv udp://127.0.0.1:portnr ansehen.

    Das ganze widevine handling wird vom inputstream-adaptive gemacht. Allerdings braucht es dafür einen Token um den Key bei widevine abzufragen. Dieser Token muss mitgegeben werden. Wie man daran kommt ist wohl Provider abhängig. Ich habe das ganze mal für den ORF umgesetzt und dafür das ORF Plugin für Kodi etwas analysiert. Ich vermute ich muss die Aufruf API für widevine noch ändern. Derzeit wird nur der token übergeben, aber ich denke es wird wohl der ganze link zum widevine server werden müssen.

    Derzeit sind noch ein paar fixe Pfade hardcodiert. Das muss man in dash2ts.cpp für den Aufruf ReadXMP und LoadAddon entsprechend anpassen. Auch das Setting DECRYPTERPATH ist anzupassen.

    Das umschalten ruckelt leider noch ein wenig, aber wenn es mal läuft dann läuft es :)

    Das ganze ist im Git https://github.com/jojo61/dash2ts

    Feedback erwünscht

    jojo61

  • jojo61 January 11, 2025 at 12:00 PM

    Changed the title of the thread from “[dash2ts] Stream IPTV mit inputstream-adaptiv und widevine” to “[dash2ts] Stream IPTV mit inputstream-adaptive und widevine”.
  • Das wäre doch sicherlich auch bei Zattoo hilfreich.

    Mein VDR

    VDR1 Mediaportal mit QVT-Board, Intel 810 Chipsatz, Pentium III 1,1 Ghz, 256 Mb Ram, WDC WD5000AAKB, DVB-S TT 1.5, Nova-S, Digidish 33, Gentoo Kernel 2.6.31, VDR 1.4.7
    VDR2 Asrock M3N78D, AMD Phenom II X6 1055T, 8 Gb Ram, Geforce GTX 950, WinTV dualHD, Gentoo Kernel 5.10, VDR 2.6.0, softhddevice
    VDR3 MC-1200, GA-B85M-HD3, Celeron G1840, Quadro P400. 4G Ram, CineS2 6, DuoFlex S2, WinTV dualHD, Gentoo Kernel 5.10, VDR 2.6.0, softhddevice
    TV TX-37LZD85F, AV VSX-520D - Consono 35


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

  • Das kam bei meinem ersten Versuch

    Code
    Jan 11 13:02:34 gentoo kernel: dash2ts[6689]: segfault at 0 ip 00007fd6fe6695e5 sp 00007ffd041d9890 error 4 in libc.so.6[7fd6fe644000+159000] likely on CPU 7 (core 1, socket 0)
    Jan 11 13:02:34 gentoo kernel: Code: ec 28 49 8b 41 08 48 89 74 24 08 44 89 44 24 18 85 c9 0f 85 05 03 00 00 83 ff 01 0f 84 74 01 00 00 83 ff 24 0f 87 6b 01 00 00 <49> 0f be 14 24 49 8b 49 68 4c 89 e3 48 89 d0 f6 44 51 01 20 74 18
    Jan 11 13:02:34 gentoo syslog-ng[4552]: Error invoking seek on file; filename='/dev/kmsg', error='Invalid argument (22)'
    Mein VDR

    VDR1 Mediaportal mit QVT-Board, Intel 810 Chipsatz, Pentium III 1,1 Ghz, 256 Mb Ram, WDC WD5000AAKB, DVB-S TT 1.5, Nova-S, Digidish 33, Gentoo Kernel 2.6.31, VDR 1.4.7
    VDR2 Asrock M3N78D, AMD Phenom II X6 1055T, 8 Gb Ram, Geforce GTX 950, WinTV dualHD, Gentoo Kernel 5.10, VDR 2.6.0, softhddevice
    VDR3 MC-1200, GA-B85M-HD3, Celeron G1840, Quadro P400. 4G Ram, CineS2 6, DuoFlex S2, WinTV dualHD, Gentoo Kernel 5.10, VDR 2.6.0, softhddevice
    TV TX-37LZD85F, AV VSX-520D - Consono 35


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

  • Braucht das Programm widevine? Ich hatte es gegen telerising laufen lassen.

    Mein VDR

    VDR1 Mediaportal mit QVT-Board, Intel 810 Chipsatz, Pentium III 1,1 Ghz, 256 Mb Ram, WDC WD5000AAKB, DVB-S TT 1.5, Nova-S, Digidish 33, Gentoo Kernel 2.6.31, VDR 1.4.7
    VDR2 Asrock M3N78D, AMD Phenom II X6 1055T, 8 Gb Ram, Geforce GTX 950, WinTV dualHD, Gentoo Kernel 5.10, VDR 2.6.0, softhddevice
    VDR3 MC-1200, GA-B85M-HD3, Celeron G1840, Quadro P400. 4G Ram, CineS2 6, DuoFlex S2, WinTV dualHD, Gentoo Kernel 5.10, VDR 2.6.0, softhddevice
    TV TX-37LZD85F, AV VSX-520D - Consono 35


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

  • Braucht das Programm widevine?

    Wenn der Stream nicht verschlüsselt ist dann braucht es kein widevine. Hast du die Pfade angepasst ? Zumindest der Pfad zum inputstream-adaptive.so und der settings.xml muss richtig gesetzt sein.

    Du siehst ja welche URLs er versucht zu öffnen. Der Debug ist ja aktiv.

    Hab noch ein paar checks mit prints eingebaut.

    Edited once, last by jojo61 (January 11, 2025 at 2:15 PM).

  • Ich habe noch ein wenig nachgearbeitet und nun sollte es leidlich stabil sein. Auch DRM Streams laufen nun flüssig und stabil.

    Ich habe mir mal Zattoo angeschaut und ich denke man kann das damit abspielen. Das Kodi Plugin dafür ist ja öffentlich und da sieht man wie es geht. Das meiste dort ist das verwalten der Kanäle, aber die müsste man für den VDR eh statisch machen.

    Das starten des inputstream-adaptive mit widevine ist auch dort recht simple wenn man den user_token für widevine hat. Vielleicht hat ja jemand Lust sich mal mit dem Zattoo Plugin zu beschäftigen :)

    Nachtrag:

    Das waipu plugin basiert auf dem Zattoo plugin und würde damit wohl auch gehn. Also jemand muss mal das Zattoo plugin analysieren :)

    Wobei die beiden plugins ja auch libs sind... hmmm

    Edited 2 times, last by jojo61 (January 14, 2025 at 4:22 PM).

  • Ich habe dash2ts in VDR*ELEC integriert. Getestet habe ich es allerdings nicht, da main() und das dashstream Script doch sehr auf ORF angewiesen sind und ich da nicht dran komme. Ein paar Tests von Eingeweihten wären sinnvoll :)

    Ein paar Ideen habe ich schon, wie man das etwas flexibler bekommt. Für Amazon Prime hatte ich mal ein Repository auf Github (samt Sourcen) gefunden, ich hoffe, ich finde es wieder. Ich habe den Eindruck, daß bei Kodi Addons die Sourcen eher selten verfügbar sind oder täuscht das nur?

  • Ich habe dash2ts in VDR*ELEC integriert.

    Super Danke.

    Wenn du Ideen hast um es flexibler zu machen dann nur raus damit. Ich weiss das ich die widewine AufrufURL übergeben müsste und evtl. auch noch die Header. Aber das ist kein Problem umzustellen.

    Amazon Prime halte ich eher für ungeschickt. Das ist alles VOD und der VDR ist für besser für lineares TV geeignet . Zattoo und waipu wären da besser geeignet und da gibt es Kodi Plugins die man sich anschauen kann. Alles per Git

    erreichbar.

    PS: Du kannst auch mit dem ORF erstmal testen ob es läuft. Da braucht es nicht für alles ein VPN nach Österreich. ORF3 ist oft offen. Leicht zu sehen wenn du on.orf.at im Browser aufrufst und da auf Live clickst.

  • ORF 3 kann man sehen? Ausgezeichnet. Dann kann ich das ja doch testen :)

    Amazon Prime war nur eine Idee, die zusammen mit dem web Plugin und einer Erweiterung des Transcoders zusammen mit deinen Arbeiten vielleicht funktionieren kann. Die Idee irgendwie an Prime und VOD zu kommen, habe ich schon länger.

    Das Problem mit den Änderungen besteht darin, daß ich nicht weiß, welche Gemeinsamkeiten waipu, Zattoo und ORF haben.
    Aber grundsätzlich kann ich mir 2 Änderungen vorstellen:
    - das Script dashstream.sh umbenennen in z.b. orfstream.sh um damit zu signalisieren, daß es für ORF gedacht ist.
    - Das main() in dash2ts.cpp ist etwas umfangreich und ich frage mich, welchen allgemeinen Teil man davon in eine eigene Prozedur auslagern kann, die man dann z.B. für andere Anbieter geschickt aufrufen kann (vielleicht nicht sogar von deiner main(), sondern aus einem anderen Programm. Da bin ich wieder beim Transcoder ;)).

    Es gibt noch einige Copmpile-Warnungen, die ich bisher ignoriert habe. VDR*ELEC kompiliert z.B. mit "-Wwrite-strings -Wunused-variable -Wunused-but-set-variable -Wmaybe-uninitialized". Die Warnungen bei "-Wparentheses -Wsign-compare" sind vielleicht nur Kosmetik.

  • dash2ts stellt im Prinzip nur ein wrapper dar um das inputstream-adaptive plugin standalone laufen zu lassen. Im Kodi läuft das nur im Zusammenhang mit einen pvr plugin.

    Ein pvr plugin ermittelt alle Daten die nötig sind um das inputstream plugin starten zu können. Das sind im wesentlichen die URL des Streams und die URL für den widewine aufruf um an den decodier Key zu kommen. Auch die verwendeten HTTP(S) Header werden dazu übergeben. Derzeit wird die URL für widevine in main() zusammengebaut und ist ORF spezifisch. Das muss sicher geändert werden und sie muss komplett von extern übergeben werden. In main() wird der Aufruf/Laden vom inputstream abgehandelt, aber auch dann das lesen des Streams und wandeln in einen mpegts Stream samt Ausgabe an den UDP Port zum IPTV plugin.

    Evtl. könnte man das aufbrechen und das lesen des Streams als Funktion realisieren die man in andere Programme einbinden kann. Die Ausgabe funktioniert eh über einen Callback den man der "neuen" Funktion dann mitgeben könnte.

    An das umbennen von dashstream.sh in orfstream.sh habe ich auch schon gedacht. Aber die Namen beim entwickeln kommen halt nicht immer gleich so Zielgerichtet :)

  • Okay. Erste Tests sind zwiespältig. Getestet habe ich CE 22 mit inputstream-adaptive 22.1.12.

    Ein einfacher Aufruf von ./dashstream.sh 3 333 liefert die Kommandozeile /usr/local/bin/dash2ts -u https://orf3.mdn.ors.at/orf/orf3/qxa/manifest.mpd -p 333 -k /storage/.kodi -d null und die fliegt mir um die Ohren mit einem segfault.

    Lasse ich den (vermutlich falschen) Parameter -d null weg, dann geht es schon viel weiter. Und ich sehe aber nur die Meldung im VDR "Dieses Video darf aus rechtlichen Gründen nur in Österreich wiedergeben werden".

    Also im Prinzip scheint es für nicht-verschlüsselte Sender zu gehen.

  • Für Amazon Prime hatte ich mal ein Repository auf Github (samt Sourcen) gefunden, ich hoffe, ich finde es wieder. Ich habe den Eindruck, daß bei Kodi Addons die Sourcen eher selten verfügbar sind oder täuscht das nur?

    Meinst du den 79er Sandmann?

    Amazon Prime war nur eine Idee, die zusammen mit dem web Plugin und einer Erweiterung des Transcoders zusammen mit deinen Arbeiten vielleicht funktionieren kann. Die Idee irgendwie an Prime und VOD zu kommen, habe ich schon länger.

    Das wär ja geil 8) - Amazon-Prime direkt im VDR (statt Kodi-Gedöns, das bei mir nie funktioniert, wenn ichs mal brauche, aber das ist ein anderes Thema).
    Da würd ich mich dann wohl doch mal mit ipTV auseinandersetzen müssen.

    MyVDR: yaVDR-Ansible (Ubuntu 20) - softhddevice-openglosd (ffmpeg 2.8) - epgd/epg2vdr - skindesigner estuary4vdr (adaptiert) - 1920x1080@50 Hz | kodi 21 - xstream
    Aerocube M40 | 300W | ASRock H61M-GE | Intel G530 | Asus ENGT520 | 2 x TT-budget S2-3200 | ASRock Smart Remote (CIR) | 4 GB RAM | 120 GB SSD | 3 TB HDD

  • Lasse ich den (vermutlich falschen) Parameter -d null weg, dann geht es schon viel weiter

    Immer diese Anwender :) Wenn es kein drm_token gibt dann lasse das -d einfach weg. Welcher Sender vom ORF gerade offen ist kannst du mit einem Broswer in 5 sekunden rausfinden. Gehe auf die Seite on.orf.at und clicke auf Live.

    Dann siehst du welche Sender gerade auch in Deutschland offen sind. Wenn der Sender nicht offen ist dann kommt das was du gesehen hast.

  • Meinst du den 79er Sandmann?

    Das ist das offizielle Addon. Ich meine aber mal eine C(++) Implementierung gesehen zu haben. Aber das ist alles nur Zukunftsmusik. Die Arbeit von jojo61 hat aber Potential :)

    Wenn es kein drm_token gibt dann lasse das -d einfach weg.

    Jaaa neee. Ich füge den Parameter ja nicht selbst dazu. Das macht das script dashstream.sh ;) Erst nachdem ich das geändert und den Parameter ganz rausgeworfen habe, konnte ich ORF3 sehen. Aber dann funktionieren die anderen wohl nicht mehr.

  • Jaaa neee. Ich füge den Parameter ja nicht selbst dazu.

    Das ist seltsam weil es bei mir ja funktioniert. Wenn im script das drm_token leer ist dann stürzt da nix ab.

    Ich habe das API noch mal erweitert und einige Compilerwarnings eliminiert. Versuch es einfach nochmal.

    Ausserdem habe ich das dashstream.sh umbenannt. Du musst die neue channels.conf nehmen.

    Anbei das neue package.mk für den VDR*Elec

  • Das ist seltsam weil es bei mir ja funktioniert. Wenn im script das drm_token leer ist dann stürzt da nix ab.

    Vielleicht liegt es ja auch an der Version. Ich habe es mit CE22 getestet. Und der Wert für den Token ist ja nicht leer, sondern hat den Wert 'null'.

    Anbei das neue package.mk für den VDR*Elec

    Perfekt. So gefällt mir das :) Die neue Version ist drin und baut auch.

  • Vielleicht liegt es ja auch an der Version.

    Ich habe die null nun mal abgefangen und ausserdem prüfe ich nun das API der inputstream lib.

    Allerdings könnte das evtl. nicht reichen. Das Problem sind die Kodi include files die ich verwende. Die sind aus der Kodi Version 21.

    Im Prinzip müsste man aber die includes aus der aktuellen Kodi Version nehmen für die gerade compiliert wird. Teste doch nochmal mit der nun aktuellen Version und wenn es nicht klappt dann muss ich mir etwas einfallen lassen wegen den includes.

    Anbei das nun aktuelle package.mk

Participate now!

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