@
sonics007 Popsáno je to např. v
Tvheadend a IPTV a já teď fakt nevím, co na tom ještě vysvětlovat. Ale nějak to zkusím.
Základní princip je ten, že místo adresy streamu, ze které do Tvheadend přichází data streamu, si Tvheadend spustí aplikaci a očekává, že data streamu dostane na jejím stdout. Tento mechanismus Tvheadend používá jak pro streamy, tak například pro data epg (xmltv) v případ tzv. interních grabberů.
Obecně je tedy formát pro data streamů následující:
kde <app> je příslušná aplikace a její parametry. Většinou se jako <app> používám ffmpeg, ale může to samozřejmě být i jiná aplikace, pokud umí na stdout poslat data streamu. Může to tedy například být i nějaký script, ve kterém se teprve zavolá ffmpeg nebo jiná aplikace.
Takže, pokud máš adresu streamu
http://link.com/stream/play.m3u8?c=nazov_atk, tak pak by to mohlo pro přímé volání ffmpeg vypadat například takto:
Kód:
pipe://ffmpeg -fflags +genpts -i http://link.com/stream/play.m3u8?c=nazov_atk -vcodec copy -acodec copy -f mpegts -mpegts_service_type digital_tv pipe:1
kde:
pipe://ffmpeg - říklá tvhedend, že má spustit aplikaci ffmpeg. Vše co následuje jsou pak už parametry ffmpeg. Tady si musíš dát pozor, jak máš ffmpeg v systému instalované a taky to, že to ffmepg je spouštěné userem pod kterým běží tvheadend. Tzn. že ne vždy stačí uvést jen ffmpeg, ale někdy je třeba například zadat celou cestu k aplikaci ffmpeg. Pokud si nejsi jistý, stačí místo ffmpeg napsat celou cestu, kde je ffmpeg uložené, rovnou. Tím rozhodně nic nezkazíš. To je třeba takto řešit například v některých *ELEC instalacích, kde není ffmpeg standardně instalováno, ale je do systému kopírováno pomocí mechanismu addon Kodi.
-i http://link.com/stream/play.m3u8?c=nazov_atk - říká, že ffmpeg bude data číst z adresy streamu
http://link.com/stream/play.m3u8?c=nazov_atk
pipe:1 - říká, že výstupní stream z výše uvedené adresy bude ffmpeg posílat na stdout
Ten příklad ale smysl moc nedává vyjma případů, kdy je potřeba jen přebalit obsah původního kontejneru do TS, kterému jedinému Tvheadend rozumí.
Častější použití je takové, že se v pipe volá nějaký script s parametrem:
Kód:
pipe:///abc/script.sh Channel1
a ve volaném scriptu se s pomocí parametru získá (například dotazem na serveru OTT služby) adresa streamu. Pak musí být někde v těle scriptu (na jeho konci) podobné volání ffmpeg, teď už pochopitelně bez pipe://:
Kód:
ffmpeg -fflags +genpts -i http://link.com/stream/play.m3u8?c=nazov_atk -vcodec copy -acodec copy -f mpegts -mpegts_service_type digital_tv pipe:1
To, že ti Tvheadend data nenačte může být způsobeno několika důvody:
- buď je adresa streamu špatná nebo je například špatná autentizace nebo skončila platnost streamu - některé OTT služby to tak mají, že součástí adresy streamu je tzv. token, pomocí kterého se určuje/kontroluje platnost vygenerované adresy
- nespustí se ffmpeg - není zadaná správně cesta k aplikaci. Tady je důležité si uvědomit, pod kterým userem se Tvheadend spouští. Ono nestačí, že když zadáš v systému příkaz ffmpeg a on se ti spustí. Tvheadend může běžet pod jiným userem a pro něj ta cesta není v jeho parametru PATH definovaná a je tedy třeba ji do volání pipe:// zadat explicitně
- ffmpeg se spustí, ale data, která dostává, nejsou platnými daty streamu - respektive ffmpeg tato data neumí dekódovat - to se stává v případě, když je pro stream použit kontejner/portokol, který použitá verze ffmpeg neumí (není sestavena s příslušnými knihovnami)