• Vítejte na XBMC-Kodi.cz
  • Česko-slovenská komunita fanoušků XBMC/Kodi
Vítejte návštevníku! Přihlášení Registrace


Hodnocení tématu:
  • 0 Hlas(ů) - 0 Průměr
  • 1
  • 2
  • 3
  • 4
  • 5
Streamlink a jeho použití v Tvheadend
#1
    Streamlink je aplikace, který umožňuje převod různých typů video streamů z různých typů zdrojů do jednotného tvaru, který je pak možné použít jako zdroj pro Tvheadend. V této roli se tak používá stejným způsobem jako např. ffmpeg, tzn. pomocí konstrukce pipe://.

Aby nedošlo k mýlce, neznamená to, že by Streamlink mohl ffmpeg plně nahradit. Pokud je třeba při převodu stream remuxovat, streamlink pro to volá právě ffmpeg. Proto také ve volání streamlink existují parametry, které použítí ffmpeg v režii streamlink, včetně například cesty k aplikaci ffmpeg, definují. To zda steramlink ffmpeg zavolá, si určuje sám, na základě parametrů, s kterými je spuštěn.

Všechny zásadní informace o aplikaci Streamlink je možné získat v streamlink.github.io. Z těch klíčových vybírám postup instalace a parametry spuštění (příkazové řádky).

Kdy použít Streamlink?

Osobně používám Streamlink v případě, kdy v Tvheadend potřebuji přijímat streamy ve formátu MPEG-DASH. Je pravda, že bych pro to mohl použít i samotné ffmpeg, v takovém případě ale musí jít o verzi, která bylo přeložena s knihovnou lib2xml. V mé aplikaci, kdy Tvheadend běží v systému CoreELEC, jsem s tím ale měl dlouhodobé problémy. Přehrávané streamy se v Kodi přehrávaly nespolehlivě, s velkým množstvím krátkodobých výpadků, při kterých obsah bufferu přehrávače klesal až k 0 %. Teprve, když jsem, na základě příspěvku od @tomx: použil Streamlink, se situace výrazně zlepšila. Nyní mi pro zpracování streamů MPEG-DASH v Tvheadend stačí běžný ffmpeg, který je součástí CoreELEC (a který není přeložený s knihovnou lib2xml), protože vlastní parsování manifestu provádí (a zjevně efektivněji) právě Streamlink. Příjem a zpracování probíhá relativně bez problémů, obsazení bufferu přehrávače v Kodi dosahuje výrazně vyšších hodnot a případné krátkodobé výpadky v plynulém přehrávání zmizely buď úplně nebo jsou až o dva řády méně časté.

Jak Streamlink instalovat? (obecný návod)

Na popis instalace v obvyklých systémech odkazuji výše. Co se týče použití streamlink v *ELEC systémech, je ale situace složitější. V tomto příspěvku se o ní zmíním jen obecně, detailní návod očekávejte případně později.

Jak Streamlink instalovat? (návod pro *ELEC systémy)

Chcete-li instalovat Streamlink do *ELEC systému, musíte si být vědomi toho, že nejde o zcela standardní proces! Je tedy třeba mít větší než pouze základní znalosti a je také třeba si uvědomit, že instalace aplikace tohoto typu jde tak trochu proti duchu *ELEC instalací. O co jde?

*ELEC instalace je optimalizovaná distribuce Linux, ze které její autoři vypustili vše zbytné s cílem, aby instalace byla co možná nejmenší, nejjednodušší a zatěžovala HW co nejméně. Z toho důvodu z instalce vypustili většinu toho, co běžný uživatel *ELEC sytému, resp. Kodi v něm, nepotřebuje. Mezi jinými i nástroje, které umožní do systému instalovat další aplikace. *ELEC systém tak možnost instalace dalších má jen ve dvou základních případech. První je instalace vybraných aplikací prostřednictvím mechanismu addons Kodi, (takto se například do *ELEC dostane i aplikace ffmpeg), druhou možností je instalace utility entware, která pak instalaci dalších aplikací zprostředkuje. Chceme-li tedy do *ELEC nějaké další aplikace instalovat, musíme použít zvláštní postup. Zkušenější uživatelé budou vědět jak na to, případně si postup vyhledají, těm méně zkušeným to zatím samostatně nedoporučuji. To je také důvod k tomu, že jsem podrobný návod na instalaci zatím neuvedl. Nejsem si totiž jistý, jestli tím někomu, kdo sám něco takového nedokáže, nezkomplikuji život...

Jak vypadá typické použití Streamlink v Tvheadend?

V tomto případě hodně záleží na celkové koncepci řešení příjmu OTT služby v Tvheadend. Ze známých důvodů se takové návody dnes už příliš nezvěřejňují, proto použití Streamlink pouze naznačím.

Obvyklý způsob, s použitím ffmpeg, má v závěrečné fázi, kdy jsou v playlistu na místě adresy streamu použita volání scriptu, např. tuto formu:
 
Kód:
${ffmpeg}ffmpeg -fflags +genpts -i ${url} -vcodec copy -acodec copy -f mpegts -mpegts_service_type digital_tv pipe:1
V použitých proměnných se pak očekává:
ffmpeg - cesta k aplikaci ffmpeg
url - adresa zdrojového steramu

Pokud chceme totéž provést s použitím Streamlink, nahradíme výše uvedenou konstrukci následovně:
 
Kód:
/storage/.opt/bin/streamlink --locale cs_CZ dash://${url} best --stdout --ffmpeg-ffmpeg "${ffmpeg}ffmpeg" --ffmpeg-fout "mpegts"
Sama aplikace Streamlink se tedy spouští příkazem /storage/.opt/bin/streamlink, který v sobě obsahuje cestu k adresáři /storage/.opt/bin/, do kterého byla aplikace v CoreELEC instalována pomocí entware.
 
Citovat
#2
Výběr streamu

Někdy se při použití streamlink v konstrukci pro pipe:// v Tvheadend může hodit výběr konkrétní kvality/rozlišení video streamu. V takovém případě v typickém volání streamlink:
 
Kód:
streamlink --locale cs_CZ dash://${url} best --stdout --ffmpeg-ffmpeg "${ffmpeg}ffmpeg" --ffmpeg-fout "mpegts"

můžeme paramer best nahradit konkrétní identifikací rozlišení streamu nebo lépe, seznamem rozlišení. Seznam je třeba uzavřít do uvozovek, např. "180p, 360p, 540p, 720p, 1080p", a streamlik ho použije tak, že ho odleva porovnává s nabídkou kvality v program streamu a pokud tam najde uvedenou kvalitu, tak ji použije, pokud ne, tak v prohledávání pokračuje. Seznam je samozřejmě možné libovolně upravit, aby začal s prohledáváním od kvality, kterou jako nejnižší možnou chcete použít. Seznam nemusí být setříděný, tzn. kvality můžeme libovolně proházet. I v seznamu je možné použít metakódy worst a best, které mohou zaručit, že v případě, pokud konkrétní kvality v seznamu streamlink nenajde, použije tyto. Typicky:
  • "360p, 540p, best" - znamená, že streamlink použije 360p, pokud v program streamu není, tak 540p a pokud tam není ani tato kvalita, použije tu nejlepší dostupnou,
  • "360p, 540p, worst" - znamená, že streamlink použije 360p, pokud v program streamu není, tak 540p a pokud tam není ani tato kvalita, použije tu nejhorší dostupnou.
V případě, pokud v seznamu nepoužijeme jednu ze dvou možností, best a nebo worst, a streamlink žádný stream nevybere, skončí s chybou. Je vhodné, pokud volání streamlink používáme např. ve scriptu, doplnit jeho volání zápisem do nějakého logu. Já to při použití v Tvheadend dělám tak, že klíčové infomace ukládám do logu vždy. Je to vhodné jak pro ladění, tak zejména pro případy, kdy poskytovatel OTT služby něco změní ve svém api. Lépe a rychleji se pak problém identifikuje. Volání streamlink pak pro tyto účely doplňuji takto:
 
Kód:
streamlink --locale cs_CZ dash://${url} best --stdout --ffmpeg-ffmpeg "ffmpeg" --ffmpeg-fout "mpegts" 2>> ${log_file}

Výpis z logu scriptu streamer.sh, který je konstrukcí pipe:// volán z playlistu pro Tvheadend pak může, při spuštění přehrávání Live TV kanálu, vypadat takto: 
 
Kód:
2024-07-29 09:38:55.509417940 id: 2346807 service: ...
2024-07-29 09:38:55.991365470 Streamlink url: https://...
[cli][info] Found matching plugin dash for URL dash://https://....
[cli][info] Available streams: 180p (worst), 360p, 540p, 720p, 1080p (best)
[cli][info] Opening stream: 1080p (dash)
[utils.named_pipe][info] Creating pipe streamlinkpipe-1153057-1-6735
[utils.named_pipe][info] Creating pipe streamlinkpipe-1153057-2-927

kde řádky začínající 2024-07-29 jsou zápisem klíčových infromací ze scriptu a řádky začínající [cli][info] nebo [utils.named_pipe][info] do logu zapisuje právě streamlink díky 2>> ${log_file}.

V případě, pokud by streamlink odpovídající kvalitu zapsanou v parametrch volání nenašel, tedy pokud by ve volání bylo např. pouze "480p", v logu se to projeví následovně:
 
Kód:
error: The specified stream(s) '480p' could not be found.
       Available streams: 180p (worst), 360p, 540p, 720p, 1080p (best)
 
Citovat
#3
Další užitečné možnosti logování

Někdy se hodí, zvláště pokud se věnujete optimalizaci zpracování real time streamů, mít přehled o tom, co se na jednotlivých úrovních zpracování streamu děje. Streamlink pro to poskytuje další možnosti, které získáte použitím dalších parametrů příkazového řádku:

--ffmpeg-verbose-path <file>

Protokoluje streamy tak, jak je vidí a zpracuje ffmpeg. Výstup může vypadat nějak takto:
 
Kód:
ffmpeg version 5.1.5-0+rpt1+deb12u1 Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 12 (Debian 12.2.0-14)
  configuration: --prefix=/usr --extra-version=0+rpt1+deb12u1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --disable-mmal --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sand --enable-sdl2 --disable-sndio --enable-libjxl --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-pocketsphinx --enable-librsvg --enable-libdc1394 --enable-libdrm --enable-vout-drm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared
  libavutil      57. 28.100 / 57. 28.100
  libavcodec     59. 37.100 / 59. 37.100
  libavformat    59. 27.100 / 59. 27.100
  libavdevice    59.  7.100 / 59.  7.100
  libavfilter     8. 44.100 /  8. 44.100
  libswscale      6.  7.100 /  6.  7.100
  libswresample   4.  7.100 /  4.  7.100
  libpostproc    56.  6.100 / 56.  6.100
[h264 @ 0x555591d97d90] Increasing reorder buffer to 2
[h264 @ 0x555591d97d90] Increasing reorder buffer to 3
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/streamlinkpipe-1929747-1-1193':
  Metadata:
    major_brand     : iso6
    minor_version   : 0
    compatible_brands: iso6dash
  Duration: 478545:15:55.22, start: 1722762953.358333, bitrate: N/A
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 600 tbn (default)
    Metadata:
      handler_name    : USP Video Handler
      vendor_id       : [0][0][0][0]
      encoder         : h264
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/streamlinkpipe-1929747-2-6040':
  Metadata:
    major_brand     : iso6
    minor_version   : 0
    compatible_brands: iso6dash
  Duration: 478545:15:55.24, start: 1722762953.321292, bitrate: N/A
  Stream #1:0[0x1](mul): Audio: aac (HE-AAC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp (default)
    Metadata:
      handler_name    : USP Sound Handler
      vendor_id       : [0][0][0][0]
Output #0, mpegts, to 'pipe:1':
  Metadata:
    major_brand     : iso6
    minor_version   : 0
    compatible_brands: iso6dash
    encoder         : Lavf59.27.100
  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 50 fps, 50 tbr, 90k tbn (default)
    Metadata:
      handler_name    : USP Video Handler
      vendor_id       : [0][0][0][0]
      encoder         : h264
  Stream #0:1(mul): Audio: aac (HE-AAC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp (default)
    Metadata:
      handler_name    : USP Sound Handler
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x555591d973d0] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x555591da6eb0] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)

--loglevel <level>
--logfile <file>

Kde loglevel určuje úroveň protokolování definovanou v <level>, což je jeden z parametrů none, critical, error, warning, info, debug, trace​all a logfile pak v parametru <file> definuje jméno souboru, do kterého se log ukládá. Je třeba vzít na vědomí, že v případě adaptivních porotkolů se do souboru <logfile> zapisují data - tzn. informce o jednotlivých chunks - postupně v průběhu přehrávání streamu. Takovýto log pak může vypadat nějak takto:
 
Kód:
[11:08:35.129900][cli][debug] OS:         Linux-6.6.31+rpt-rpi-2712-aarch64-with-glibc2.36
[11:08:35.130107][cli][debug] Python:     3.11.2
[11:08:35.130188][cli][debug] Streamlink: 5.2.1
[11:08:35.130828][cli][debug] Dependencies:
[11:08:35.136586][cli][debug]  PySocks: 1.7.1
[11:08:35.137055][cli][debug]  certifi: 2022.9.24
[11:08:35.137534][cli][debug]  isodate: 0.6.1
[11:08:35.137923][cli][debug]  lxml: 4.9.2
[11:08:35.138526][cli][debug]  pycountry: 22.3.5
[11:08:35.138876][cli][debug]  pycryptodomex: 3.11.0
[11:08:35.139285][cli][debug]  requests: 2.28.1
[11:08:35.140559][cli][debug]  urllib3: 1.26.12
[11:08:35.141002][cli][debug]  websocket-client: 1.2.3
[11:08:35.141502][cli][debug]  importlib-metadata: 4.12.0
[11:08:35.141752][cli][debug] Arguments:
[11:08:35.141794][cli][debug]  url=dash://https://...
[11:08:35.141829][cli][debug]  stream=['best']
[11:08:35.141871][cli][debug]  --loglevel=all
[11:08:35.141901][cli][debug]  --logfile=/home/kodi/TVServer/playlist/o2tv/streamer.str
[11:08:35.141931][cli][debug]  --locale=cs_CZ
[11:08:35.141975][cli][debug]  --stdout=True
[11:08:35.142022][cli][debug]  --ffmpeg-ffmpeg=ffmpeg
[11:08:35.142049][cli][debug]  --ffmpeg-verbose-path=/home/kodi/TVServer/playlist/o2tv/streamer.ffm
[11:08:35.142074][cli][debug]  --ffmpeg-fout=mpegts
[11:08:35.142324][cli][info] Found matching plugin dash for URL dash://https://...
[11:08:35.142412][plugins.dash][debug] URL=https://...
[11:08:35.449667][utils.l10n][debug] Language code: cs_CZ
[11:08:35.449898][stream.dash][debug] Available languages for DASH audio streams: mul, en (using: mul)
[11:08:35.450648][cli][info] Available streams: 180p (worst), 360p, 540p, 720p, 1080p (best)
[11:08:35.450735][cli][info] Opening stream: 1080p (dash)
[11:08:35.450956][stream.dash][debug] Opening DASH reader for: video=5852800 (video/mp4)
[11:08:35.451792][stream.dash][debug] Opening DASH reader for: audio_145100_mul=144000 (audio/mp4)
[11:08:35.452153][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=3))
[11:08:35.452514][stream.dash][debug] Reloading manifest (video=5852800:video/mp4)
[11:08:35.453683][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=1))
[11:08:35.454203][stream.dash][debug] Reloading manifest (audio_145100_mul=144000:audio/mp4)
[11:08:35.455089][stream.ffmpegmux][trace] Querying FFmpeg version: ['/usr/bin/ffmpeg', '-version']
[11:08:35.466611][stream.dash][debug] Download of segment: 3113-video=5852800.dash complete
[11:08:35.572330][stream.dash][debug] Download of segment: 3113-audio_145100_mul=144000.dash complete
[11:08:35.577946][stream.ffmpegmux][debug] ffmpeg version 5.1.5-0+rpt1+deb12u1 Copyright (c) 2000-2024 the FFmpeg developers
[11:08:35.578198][stream.ffmpegmux][debug]  built with gcc 12 (Debian 12.2.0-14)
[11:08:35.578342][stream.ffmpegmux][debug]  configuration: --prefix=/usr --extra-version=0+rpt1+deb12u1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --disable-mmal --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sand --enable-sdl2 --disable-sndio --enable-libjxl --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-pocketsphinx --enable-librsvg --enable-libdc1394 --enable-libdrm --enable-vout-drm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared
[11:08:35.578449][stream.ffmpegmux][debug]  libavutil      57. 28.100 / 57. 28.100
[11:08:35.578537][stream.ffmpegmux][debug]  libavcodec     59. 37.100 / 59. 37.100
[11:08:35.578624][stream.ffmpegmux][debug]  libavformat    59. 27.100 / 59. 27.100
[11:08:35.578706][stream.ffmpegmux][debug]  libavdevice    59.  7.100 / 59.  7.100
[11:08:35.578787][stream.ffmpegmux][debug]  libavfilter     8. 44.100 /  8. 44.100
[11:08:35.578864][stream.ffmpegmux][debug]  libswscale      6.  7.100 /  6.  7.100
[11:08:35.578941][stream.ffmpegmux][debug]  libswresample   4.  7.100 /  4.  7.100
[11:08:35.579020][stream.ffmpegmux][debug]  libpostproc    56.  6.100 / 56.  6.100
[11:08:35.579137][utils.named_pipe][info] Creating pipe streamlinkpipe-1928849-1-2347
[11:08:35.579807][utils.named_pipe][info] Creating pipe streamlinkpipe-1928849-2-1357
[11:08:35.580035][stream.ffmpegmux][debug] ffmpeg command: /usr/bin/ffmpeg -nostats -y -i /tmp/streamlinkpipe-1928849-1-2347 -i /tmp/streamlinkpipe-1928849-2-1357 -c:v copy -c:a copy -copyts -f mpegts pipe:1
[11:08:35.580378][stream.ffmpegmux][debug] Starting copy to pipe: /tmp/streamlinkpipe-1928849-1-2347
[11:08:35.580572][stream.ffmpegmux][debug] Starting copy to pipe: /tmp/streamlinkpipe-1928849-2-1357
[11:08:35.580944][cli][debug] Pre-buffering 8192 bytes
[11:08:35.599393][stream.dash][debug] Download of segment: 3113-audio_145100_mul=144000-82692600101822.dash complete
[11:08:35.611586][stream.dash][debug] Download of segment: 3113-audio_145100_mul=144000-82692600193982.dash complete
[11:08:35.827421][stream.dash][debug] Download of segment: 3113-video=5852800-1033657501259.dash complete
[11:08:36.069747][cli][debug] Writing stream to output
[11:08:36.156213][stream.dash][debug] Download of segment: 3113-video=5852800-1033657502411.dash complete
[11:08:37.451550][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=3))
[11:08:37.452481][stream.dash][debug] Reloading manifest (video=5852800:video/mp4)
[11:08:37.453546][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=1))
[11:08:37.454314][stream.dash][debug] Reloading manifest (audio_145100_mul=144000:audio/mp4)
[11:08:39.451719][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=3))
[11:08:39.453102][stream.dash][debug] Reloading manifest (video=5852800:video/mp4)
[11:08:39.454175][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=1))
[11:08:39.459728][stream.dash][debug] Reloading manifest (audio_145100_mul=144000:audio/mp4)
[11:08:39.513866][stream.dash][debug] Download of segment: 3113-audio_145100_mul=144000-82692600286142.dash complete
[11:08:39.532900][stream.dash][debug] Download of segment: 3113-audio_145100_mul=144000-82692600378302.dash complete
[11:08:39.803711][stream.dash][debug] Download of segment: 3113-video=5852800-1033657503563.dash complete
[11:08:40.240029][stream.dash][debug] Download of segment: 3113-video=5852800-1033657504715.dash complete
[11:08:41.451884][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=3))
[11:08:41.453285][stream.dash][debug] Reloading manifest (video=5852800:video/mp4)
[11:08:41.455577][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=1))
[11:08:41.457137][stream.dash][debug] Reloading manifest (audio_145100_mul=144000:audio/mp4)
[11:08:41.482584][stream.dash][debug] Download of segment: 3113-audio_145100_mul=144000-82692600470462.dash complete
[11:08:41.789007][stream.dash][debug] Download of segment: 3113-video=5852800-1033657505867.dash complete
[11:08:43.452037][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=3))
...

Já mám obvykle se scriptu streamer.sh, připraveny dvě verze volání streamlink, z nichž jedna obsahuje pouze základní porotokolování, zatímco druhá to úplné. Umožní mi to mít základní přehled o chování stremů kdykoliv (i zpětně) - to když použiju tu první verzi - a v případě, že dojde k nějakému problému, tak si uvolním tu verzi druhou, kde vidím úplně všechno. Tady je třeba si uvědomit, že verze s úplným protokolováním o něco prodlouží čas  volby/přepnutí kanálů, ale také to, že může na disk/kartu zapisovat soustavně nějaká data, což může být u některých konfigurací nežádoucí.
 
Citovat
#4
2024-11-02 08:12:18.607 mpegts: TMGO Viasat True Crime in TMGO TEST - tuning on IPTV #12024-11-02 08:12:18.610 spawn: Executing "/usr/bin/streamlink"2024-11-02 08:12:18.610 subscription: 0056: "scan" subscribing to mux "TMGO Viasat True Crime", weight: 6, adapter: "IPTV #1", network: "TMGO TEST", service: "Raw PID Subscription"2024-11-02 08:12:19.142 spawn: [cli][info] Found matching plugin dash for URL dash://http://157.90.115.28:5601/tmobile/4606.m3u8720p2024-11-02 08:12:19.831 spawn: Available streams: 270p (worst), 540p, 720p_alt, 720p, 1080p (best)2024-11-02 08:12:19.998 iptv: stdin pipe 26 unexpectedly closed: No data2024-11-02 08:12:33.607 mpegts: TMGO Viasat True Crime in TMGO TEST - scan no data, failed2024-11-02 08:12:33.607 subscription: 0056: "scan" unsubscribing2024-11-02 08:13:02.311 mpegts: TMGO Viasat True Crime in TMGO TEST - tuning on IPTV #12024-11-02 08:13:02.314 subscription: 0057: "scan" subscribing to mux "TMGO Viasat True Crime", weight: 6, adapter: "IPTV #1", network: "TMGO TEST", service: "Raw PID Subscription"2024-11-02 08:13:02.315 spawn: Executing "/usr/bin/streamlink"2024-11-02 08:13:03.003 spawn: [cli][info] Found matching plugin dash for URL dash://http://157.90.115.28:5601/tmobile/4606.m3u82024-11-02 08:13:03.492 spawn: [cli][info] Available streams: 270p (worst), 540p, 720p_alt, 720p, 1080p (best)2024-11-02 08:13:03.492 spawn: [cli][info] Opening stream: 720p (dash)2024-11-02 08:13:03.519 spawn: [utils.named_pipe][info] Creating pipe streamlinkpipe-75303-1-30542024-11-02 08:13:03.520 spawn: [utils.named_pipe][info] Creating pipe streamlinkpipe-75303-2-95612024-11-02 08:13:17.311 mpegts: TMGO Viasat True Crime in TMGO TEST scan complete2024-11-02 08:13:17.311 subscription: 0057: "scan" unsubscribing2024-11-02 08:13:19.687 spawn: [stream.ffmpegmux][error] Pipe copy aborted: /tmp/streamlinkpipe-75303-1-30542024-11-02 08:13:19.745 spawn: [stream.dash][warning] Download of segment: Fragments(video=17305351876002000) aborted2024-11-02 08:13:20.134 spawn: [cli][info] Stream ended2024-11-02 08:13:20.134 spawn: error: Error when writing to output: [Errno 32] Broken pipe, exiting2024-11-02 08:13:20.134 spawn: [cli][info] Closing currently open stream...

Nevite vcem muze byt chyba?
 
Citovat
#5
No, potřeboval bych vidět jak vypadá to volání streamlink, jaké jsou jeho parametry.

Resp. nejlepší by bylo udělat kompletní protokol pokusu o spuštění přehrávání toho kanálu, o kterém píšu nahoře.

Mé volání streamlink ve scriptu, které je obsahem playlistu v Tvheadend, vypadá pro potřeby testování takto:
Kód:
streamlink --locale cs_CZ --loglevel all --logfile ${str_file} dash://${url} best --stdout --ffmpeg-ffmpeg "ffmpeg" --ffmpeg-fout "mpegts" --ffmpeg-verbose-path ${ffm_file} 2>> ${log_file}

str_file, ffm_file a log_file jsou proměnné, ve kterých mám uložené názvy souborů (s celou cestou od kořenového segmentu!), do kterých se to volání streamlink protokoluje. Nejdůležitěší je protokol ukládáný do souboru jehož jméno je obsažené v str_file.

A jen pro ilustraci, obsah prokolu ukládáného do souboru obsaženého v str_file pak vypadá takto (je to pro O2TV, ale ot je jedno, v tomto případě to mají oba provideři podobné):
Kód:
[11:02:24.188339][cli][debug] OS:         Linux-6.6.31+rpt-rpi-2712-aarch64-with-glibc2.36
[11:02:24.188561][cli][debug] Python:     3.11.2
[11:02:24.188633][cli][debug] Streamlink: 5.2.1
[11:02:24.189353][cli][debug] Dependencies:
[11:02:24.201535][cli][debug]  PySocks: 1.7.1
[11:02:24.201986][cli][debug]  certifi: 2022.9.24
[11:02:24.202454][cli][debug]  isodate: 0.6.1
[11:02:24.202841][cli][debug]  lxml: 4.9.2
[11:02:24.203449][cli][debug]  pycountry: 22.3.5
[11:02:24.203802][cli][debug]  pycryptodomex: 3.11.0
[11:02:24.204207][cli][debug]  requests: 2.28.1
[11:02:24.205557][cli][debug]  urllib3: 1.26.12
[11:02:24.206134][cli][debug]  websocket-client: 1.2.3
[11:02:24.206662][cli][debug]  importlib-metadata: 4.12.0
[11:02:24.206920][cli][debug] Arguments:
[11:02:24.206967][cli][debug]  url=dash://https://aw-ucdn-3201-prod.tv.cetin.cz/bpk-tv/3184/output0/manifest.mpd?...
[11:02:24.207002][cli][debug]  stream=['best']
[11:02:24.207045][cli][debug]  --loglevel=all
[11:02:24.207074][cli][debug]  --logfile=/home/kodi/TVServer/playlist/o2tv/streamer.str
[11:02:24.207105][cli][debug]  --locale=cs_CZ
[11:02:24.207150][cli][debug]  --stdout=True
[11:02:24.207200][cli][debug]  --ffmpeg-ffmpeg=ffmpeg
[11:02:24.207226][cli][debug]  --ffmpeg-verbose-path=/home/kodi/TVServer/playlist/o2tv/streamer.ffm
[11:02:24.207252][cli][debug]  --ffmpeg-fout=mpegts
[11:02:24.207521][cli][info] Found matching plugin dash for URL dash://https://aw-ucdn-3201-prod.tv.cetin.cz/bpk-tv/3184/output0/manifest.mpd?...
[11:02:24.207612][plugins.dash][debug] URL=https://aw-ucdn-3201-prod.tv.cetin.cz/bpk-tv/3184/output0/manifest.mpd?...
[11:02:24.554768][utils.l10n][debug] Language code: cs_CZ
[11:02:24.554984][stream.dash][debug] Available languages for DASH audio streams: cs (using: cs)
[11:02:24.555725][cli][info] Available streams: 180p (worst), 360p, 540p, 720p, 1080p (best)
[11:02:24.555813][cli][info] Opening stream: 1080p (dash)
[11:02:24.556031][stream.dash][debug] Opening DASH reader for: video=5400000 (video/mp4)
[11:02:24.556940][stream.dash][debug] Opening DASH reader for: audio_129102_cze=128000 (audio/mp4)
[11:02:24.557299][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=2))
[11:02:24.558251][stream.dash][debug] Reloading manifest (video=5400000:video/mp4)
[11:02:24.560063][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=1))
[11:02:24.560317][stream.dash][debug] Reloading manifest (audio_129102_cze=128000:audio/mp4)
[11:02:24.562056][stream.ffmpegmux][trace] Querying FFmpeg version: ['/usr/bin/ffmpeg', '-version']
[11:02:24.571403][stream.dash][debug] Download of segment: 3184-video=5400000.dash complete
[11:02:24.670748][stream.ffmpegmux][debug] ffmpeg version 5.1.6-0+deb12u1+rpt1 Copyright (c) 2000-2024 the FFmpeg developers
[11:02:24.670867][stream.ffmpegmux][debug]  built with gcc 12 (Debian 12.2.0-14)
[11:02:24.670907][stream.ffmpegmux][debug]  configuration: --prefix=/usr --extra-version=0+deb12u1+rpt1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --disable-mmal --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sand --enable-sdl2 --disable-sndio --enable-libjxl --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-pocketsphinx --enable-librsvg --enable-libdc1394 --enable-libdrm --enable-vout-drm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared
[11:02:24.670950][stream.ffmpegmux][debug]  libavutil      57. 28.100 / 57. 28.100
[11:02:24.670982][stream.ffmpegmux][debug]  libavcodec     59. 37.100 / 59. 37.100
[11:02:24.671009][stream.ffmpegmux][debug]  libavformat    59. 27.100 / 59. 27.100
[11:02:24.671033][stream.ffmpegmux][debug]  libavdevice    59.  7.100 / 59.  7.100
[11:02:24.671059][stream.ffmpegmux][debug]  libavfilter     8. 44.100 /  8. 44.100
[11:02:24.671082][stream.ffmpegmux][debug]  libswscale      6.  7.100 /  6.  7.100
[11:02:24.671105][stream.ffmpegmux][debug]  libswresample   4.  7.100 /  4.  7.100
[11:02:24.671127][stream.ffmpegmux][debug]  libpostproc    56.  6.100 / 56.  6.100
[11:02:24.671186][utils.named_pipe][info] Creating pipe streamlinkpipe-992914-1-2326
[11:02:24.671479][utils.named_pipe][info] Creating pipe streamlinkpipe-992914-2-5599
[11:02:24.671635][stream.ffmpegmux][debug] ffmpeg command: /usr/bin/ffmpeg -nostats -y -i /tmp/streamlinkpipe-992914-1-2326 -i /tmp/streamlinkpipe-992914-2-5599 -c:v copy -c:a copy -copyts -f mpegts pipe:1
[11:02:24.671887][stream.ffmpegmux][debug] Starting copy to pipe: /tmp/streamlinkpipe-992914-1-2326
[11:02:24.672043][stream.ffmpegmux][debug] Starting copy to pipe: /tmp/streamlinkpipe-992914-2-5599
[11:02:24.672427][cli][debug] Pre-buffering 8192 bytes
[11:02:24.705535][stream.dash][debug] Download of segment: 3184-audio_129102_cze=128000.dash complete
[11:02:24.725230][stream.dash][debug] Download of segment: 3184-audio_129102_cze=128000-83066003391422.dash complete
[11:02:24.740861][stream.dash][debug] Download of segment: 3184-audio_129102_cze=128000-83066003483582.dash complete
[11:02:24.923797][stream.dash][debug] Download of segment: 3184-video=5400000-1038325042379.dash complete
[11:02:25.155530][cli][debug] Writing stream to output
[11:02:25.287342][stream.dash][debug] Download of segment: 3184-video=5400000-1038325043531.dash complete
[11:02:26.556602][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=2))
[11:02:26.557591][stream.dash][debug] Reloading manifest (video=5400000:video/mp4)
[11:02:26.558851][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=1))
[11:02:26.559596][stream.dash][debug] Reloading manifest (audio_129102_cze=128000:audio/mp4)
[11:02:28.556756][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=2))
[11:02:28.557787][stream.dash][debug] Reloading manifest (video=5400000:video/mp4)
[11:02:28.559113][stream.dash_manifest][debug] Generating segment timeline for dynamic playlist (id=1))
[11:02:28.560309][stream.dash][debug] Reloading manifest (audio_129102_cze=128000:audio/mp4)
[11:02:28.614527][stream.dash][debug] Download of segment: 3184-audio_129102_cze=128000-83066003575742.dash complete
[11:02:28.912473][stream.dash][debug] Download of segment: 3184-video=5400000-1038325044683.dash complete
...

Já teď odcházím a budu zas až večer...
 
Citovat
#6
[cli][info] Found matching plugin dash for URL dash://https://vlive107.cdn.magio.tv/___PARAM_DI25281187.CI383320.TI8___/___CONTENT_813f3932f5838845baeb1843e535f954___/sdash/LIVE$CT1_HD_OTT/index.mpd/Manifest?start=LIVE&e>
[cli][info] Available streams: 270p (worst), 540p, 720p (best)
[cli][info] Opening stream: 720p (dash)
[utils.named_pipe][info] Creating pipe streamlinkpipe-332022-1-7673
[utils.named_pipe][info] Creating pipe streamlinkpipe-332022-2-2917
[stream.ffmpegmux][error] Pipe copy aborted: /tmp/streamlinkpipe-332022-2-2917
[stream.ffmpegmux][error] Pipe copy aborted: /tmp/streamlinkpipe-332022-1-7673
[stream.dash][warning] Download of segment: Fragments(audio_482_cze=83071224255102) aborted
[stream.dash][warning] Download of segment: Fragments(video=17306505052946350) aborted
[cli][info] Stream ended
error: Error when writing to output: [Errno 32] Broken pipe, exiting
[cli][info] Closing currently open stream...
 
Citovat
#7
@Bajtik: Jak jsem uvedl v příkladu parametrů pro streamlink, tak tam ještě alespoň povol úplné logování, tzn. parametr --loglevel all. A ještě jsem chtěl vidět ty parametry volání streamlink.

Z toho, co jsi poslal je vidět, že ffmpeg volaný ze streamlink nedostává steram, kterému by rozuměl. Je potřeba vidět, jaký ffmpeg se spouští, proto je třeba to úplné logování.

A nemá on ten DASH náhodou DRM ochranu? Pak by ho ffmpeg samozřejmě nedokázal zpracovat. Je tu vůbec někdo, kdo to TV GO po těch posledních listopadových změnách v externím přehrívači přijímá (ted ne v Kodi a s InputStream Adaptive)?
 
Citovat
#8
@JiRo: TV GO Playlist funguje, když se nastaví v kodi playlist pro externí přehrávač a tento playlist poté funguje v Tivimate, ale token je vždy platný 24 hodin, což znamená, že kvůli tokenu a skladbě playlistu, nelze ani seřadit programy a nebo přidat do svého playlistu
 
Citovat
#9
@kevinlos: Díky, za info. Tak to bude pro @Bajtik: dobrá zpráva.

No jo, omezená platnost tokenů je u těchto služeb obvyklá, má to tak většina, liší se to pouze dobou platnosti. Proto také tento addon playlist po zvoleném čase přepisuje. Seřadit programy jde pomocí TV GO Sort Channels. Nevím, kde ti to běží, ale pokud by to byl nějaký Linux (třeba i *ELEC) systém, tak máš možnost si na něj pořídit Tvheadend a pak to řešit v něm a v Tivimate použít jeho playlist. Je to ale o dost složitější.
 
Citovat
#10
@JiRo: používám přes kodi v android boxu. Nejlepší to bylo přes IPTV Web Server, kde jsem si poskladal z různých operátorů playlist a vždy, když se spustilo kodi, tak se spustil IPTV Web Server a poté jsem už mohl sledovat přes Tivimate. Teď když je jen DASH, tak bohužel TM služba už nejde přehrát. TVH jsem zkoušel, ale moc tomu nerozumím, tak jsem to vzdal, uvidíme co bude zítra, přal bych si, aby se znovu vrátilo HLS, ale to bych chtěl hodně, třeba se někomu podaří jiná metoda.
 
Citovat
#11
@kevinlos: Tak i v IPTV Web Server s DASH by to mohlo fungovat, jen by se tomu musel někdo trochu věnovat. Já na to chuť ani čas nemám, ale snad se někdo jiný najde...
 
Citovat
  


Přejít na fórum:


Prochází: 1 host(ů)