Rozhodl jsem se zprovoznit streamování digitální televize v linuxu, protože od 21. 10. 2005 běží v ČR řádné DVB-T vysílání. Kromě toho jsou tu postřehy k streamování DVB-S (DVB-S2) a analogového signálu.
[ENGLISH] I hope that some hints could be useful also for English speaking visitors. Feel free to write an email. Or try English translation by Google ;-)[/ENGLISH]
Seznam digitálních karet podporovaných linuxem (nebo alespoň poznaných) je na webu www.linuxtv.org a nebo také v sekci hardware na AbcLinuxu.
Odzkoušel jsem tyto karty:
S kartou Hauppauge NOVA-t jsem neudělal dobrý nákup. Kombinace čipů Philips a Grunding se neukázala jako dobrá. Karta špatně ladila, byl problém s verzí modulu pro frontend a celkově působila zbastleně. Pájení nakřivo, popisky napůl smazané, konektor pro anténu nesymetrický. V krabici byla pouze karta a kus molitanu.
Zcela jistě funguje (osobně znám 2 lokality) a pro streamování je vhodná karta Hauppauge WinTV NOVA-t budget PCI, ovšem s čipem Philips SAA7146A a frontendem Philips TDA 10045. Poslední model firmy Hauppauge se jmenuje Hauppauge NOVA-t budget (model 90002), a je celý založen na čipech od Conexantu (Bridge: Conexant CX2388, Demodulator: Conexant CX22702). V diskuzních fórech se řeší její podpora v linuxu.
Karta od Averu má horší tuner, takže potřebuje lepší anténu, ale zase má více vymožeností. V krabici je dálkové ovládání + IR čidlo, nějaká propojka pro video výstup a krátký návod pro instalaci. Pozitivní je, že ji výrobce označuje Linux compatible a vydal k ní dokonce návod pro linux.
TechniSat AirStar2 je nejlepší z testovaných. Má velmi citlivý tuner (násobně lepší oproti Aver 771). Navíc má vstup i výstup pro anténu, takže je průchozí pro zapojení v sérii. Pokud je na zadní straně žlutá samolepka, poskytuje také 5 V pro aktivní napájení antény, což může někdy vadit (viz tvfreak.cz). Balení obsahuje i dálkové ovládání a IR čidlo do seriového portu. Vše je kompatibilní s lirc, konfigurační soubor pro ovladač je na přiloženém CD (pro WinLIRC).
Skystar2 PCI je výborná DVB-S karta, jen musíte mít to štěstí a získat HW revizi 2.3 nebo 2.6D. Nové lze koupit jen v revizi 2.8 a ta zatím není podporována v linuxu. Existuje jen binární ovladač cx24113 driver. Až bude jednou GPL ovladač, bude to také skvělá karta.
TT S2-3200 s CI slotem je skoro kompletní řešení pro linuxové PC. Drivery jsou zatím experimentální (a mimo oficiální jádro) na http://jusst.de/hg/multiproto/. Je spolehlivá, driver ladí dobře, CI slot je funkční, zvládá i DVB-S2
Karta je osazena tunerem Conexant fusion 878A a digitálním frontendem Samsung MT352CG. DVB patche pro vlastní kompilaci jádra jsou k dispozici na www.linuxtv.org. Mnoho nových věcí přibylo v jádru 2.6.12 a dále v 2.6.14. Jádro 2.6.12 (2.6.13; FC4) kartu pozná jako
$lspci -v 03:02.0 Multimedia video controller: Brooktree Corporation Bt878 Video Capture (rev 11) Subsystem: Avermedia Technologies Inc: Unknown device 0771 Flags: bus master, medium devsel, latency 32, IRQ 10 Memory at dfafe000 (32-bit, prefetchable) [size=4K] Capabilities: [44] Vital Product Data Capabilities: [4c] Power Management version 2 03:02.1 Multimedia controller: Brooktree Corporation Bt878 Audio Capture (rev 11) Subsystem: Avermedia Technologies Inc: Unknown device 0771 Flags: bus master, medium devsel, latency 32, IRQ 10 Memory at dfaff000 (32-bit, prefetchable) [size=4K] Capabilities: [44] Vital Product Data Capabilities: [4c] Power Management version 2
výpis z dmesg
Linux video capture interface: v1.00 bttv: driver version 0.9.16 loaded bttv: using 8 buffers with 2080k (520 pages) each for capture bttv: Bt8xx card found (0). ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10 ACPI: PCI Interrupt 0000:03:02.0[A] -> Link [LNKC] -> GSI 10 (level, low) -> IRQ 10 bttv0: Bt878 (rev 17) at 0000:03:02.0, irq: 10, latency: 32, mmio: 0xdfafe000 bttv0: detected: AVermedia AverTV DVB-T 771 [card=123], PCI subsystem ID is 1461:0771 bttv0: using: AVerMedia AVerTV DVB-T 771 [card=123,autodetected] bttv0: gpio: en=00000000, out=00000000 in=0095004f [init] bttv0: using tuner=4 bttv0: registered device video0 bttv0: registered device vbi0 bttv0: PLL: 28636363 => 35468950 .. ok bttv0: add subdevice "remote0" bttv0: add subdevice "dvb0" bt878: AUDIO driver version 0.0.0 loaded bt878: Bt878 AUDIO function found (0). ...
aby šlo používat frontend, je nutné ručně zavést moduly (nebo je zapsat na patřičná místa /etc/rc.d/rc.local)
modprobe dvb-core modprobe dvb_bt8xx
a poté se objeví...
$dmesg ... DVB: registering new adapter (bttv0). DVB: registering frontend 0 (Zarlink MT352 DVB-T)...
Jiná (MDK) a starší (2.6.8; 2.6.12pre) jádra potřebovala pomoc. Osvědčilo se vyházet všechny moduly, které měli co dočinění s kartou nebo videozařízením (rmmod bttv a btcx_risc, video_buf, tuner, videodev, v4l2_common, firmware_class...) a následně načíst modprobe dvb-core a dále bttv, bt878, dvb_bt8xx případně mt352.
Zařízení v /dev udělá správně udev verze alespoň 054. Jinak je na netu plno návodů, jak je udělat ručně. Měla by existovat alespoň /dev/dvb/adapter0/demux0 (pro 1 DVB kartu) ./dvr0, ./frontend0, ./net0... U jader 2.4.x a prvních 2.6.x je ještě staré číslovaní device major number 250, předěláno později na 212.
Velmi pěkný návod je na wilco.bercot.org/debian/s2-3200.html. Je nutné použít experimentální ovladače z http://jusst.de/hg/multiproto a pak načíst moduly. S menšími kompilačními problémy pomůže Google, s většími mailing-list linuxtv.org.
//vše uchovat v /opt/dvb a nebo /usr/src podle chuti $ mkdir -p /opt/dvb $ cd /opt/dvb $ apt-get install mercurial $ hg clone http://jusst.de/hg/multiproto // a nebo lépe hg clone http://jusst.de/hg/multiproto_plus s lepší podporou pro VDR $ cd multiproto // Patch pro novější 2.6.24 $ cd v4l $ wget http://linuxtv.org/hg/v4l-dvb/raw-file/b0815101889d/v4l/compat.h $ mv compat.h.1 compat.h $ cd .. // kompilace $ make $ make install // Načíst moduly nebo restart $ reboot
Identifikace
$lspci -v 02:0a.0 Multimedia controller: Philips Semiconductors SAA7146 (rev 01) Subsystem: Technotrend Systemtechnik GmbH S2-3200 Flags: bus master, medium devsel, latency 64, IRQ 21 Memory at feaef400 (32-bit, non-prefetchable) [size=512]
načíst moduly
modprobe dvb_core cam_debug=255 modprobe stb6100 modprobe stb0899 modprobe lnbp21 modprobe budget-ci
výpis z dmesg
saa7146: found saa7146 @ mem f8942400 (revision 1, irq 19) (0x13c2,0x1019). saa7146 (0): dma buffer size 192512 DVB: registering new adapter (TT-Budget S2-3200 PCI) adapter has MAC addr = 00:d0:5c:64:98:97 input: Budget-CI dvb ir receiver saa7146 (0) as /devices/pci0000:00/0000:00:1e.0/0000:02:0b.0/input/input5 budget_ci: CI interface initialised input: GenPS/2 Genius Mouse as /devices/platform/i8042/serio1/input/input6 stb0899_attach: Attaching STB0899 stb6100_attach: Attaching STB6100 DVB: registering frontend 0 (STB0899 Multistandard)...
Teď by měla být karta připravená
$ls /dev/dvb/adapter0/ ca0 demux0 dvr0 frontend0 net0
Jakmile se karta úspěšně objeví v dmesg (případně úspěšně otestuje udevtestem), je správný čas začít hledat signál. Na manipulaci s DVB signálem jsou nejlepší DVB aplikace http://www.linuxtv.org/downloads/linuxtv-dvb-apps-1.1.0.tar.bz2. Jednoduše stáhnou a zkompilovat. Je možno použít CVS verzi, ale mně stačí ta vydaná. Třeba v ~/dvb-apps/util/scan/ spustit utilitku
./scan dvb-t/cz-Praha > ~/.tzap/channel.conf
což prozkoumá signál na frekvencích a parametrech podle souboru dvb-t/cz-Praha a výsledek skenování uloží do souboru channels.conf. Můj soubor cz-Praha vypadá k 25.10.2005 takto:
# DVB-T Praha (Prague, Czech Republic) # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy # CRa - Ceske radiokomunikace T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # CDG - Czech Digital Group T 674000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # Telecom T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
Dne 21.10.2005 začalo v ČR oficiálně digitální vysílání vysílání. Technické informace jsou na stránkách České radiokomunikace, Český Telecom a Czech Digital Group.
V současné době chytám jen CRa a CTc, takže channels.conf je trochu krátký.
CT1. A:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:641:1 CT2. A:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:514:642:2 CT24. A:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:515:643:3 Nova. A:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:516:644:4 CRo 2 - Praha. A:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:658:18 CRo 3 - Vltava. A:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:659:19 CRo D-dur. A:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:661:21 CRo Leonardo. A:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:662:22 CRo Radio Cesko. A:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:663:23 - Test 1:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1101:1102:1 - Test 2:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1201:1202:2 - Ocko:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1301:1302:3 - TV hry Fusion a Putti:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1401:1402:4
Signál lze zkušebně chytat pomocí utilitky tzap Pokud výpis ukazuje FE_LOCK, znamená to, že frontend zachytil signál :-).
~/dvb-apps/util/szap/tzap "CT1. A" using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0' tuning to 506000000 Hz status 00 | signal 000b | snr 00cf | ber 00000000 | unc 00000000 | status 00 | signal 000b | snr 0001 | ber 000040f8 | unc 00000000 | FE_LOCK status 00 | signal 000b | snr 0001 | ber 000040f8 | unc 00000000 | FE_LOCK status 00 | signal 000b | snr 0001 | ber 000040f8 | unc 00000000 | FE_LOCK
A vysvětlení hodnot je následující:
Se zachyceným signálem jde dělat spousta věcí:
./tzap -r "CT1. A" mplayer /dev/dvb/adapter0/dvr0
nebo
./tzap -r "CT1. A" xine stdin://mpeg2 < /dev/dvb/adapter0/dvr0
Postup je stejný jako u DVB-T, pouze místo tzap se používá szap atd.. Jelikož TT S2-3200 používá multiproto API, není možné používat aplikace kompilované proti standardnímu jadernému DVB (V4L2) API a je nutné si všechno překompilovat a pro všechny programy použít CPPFLAGS += -I/opt/dvb/multiproto_plus/linux/include (nebo kde je zkompilované multiproto)
Pokud je člověk líný hledat signál a kanály, channels.conf lze stáhnou z www.linowsat.com. Například kousek z Astry 3A:
:->0235-11992__by Linowsat Ladte 11876 MHz;CS Link:11992:hC34:S23.5E:27500:0:0:0:0:9000:3:3215:0 FILMBOX;CS Link:11992:hC34:S23.5E:27500:2570:2571=cze:0:0:9001:3:3215:0 Nova;CS Link:11992:hC34:S23.5E:27500:2580:2581=cze:2582:0:9002:3:3215:0 FILMBOX EXTRA;CS Link:11992:hC34:S23.5E:27500:2590:2591=cze:0:0:9003:3:3215:0 Public TV;CS Link:11992:hC34:S23.5E:27500:2608:2609=cze:0:0:9004:3:3215:0 CS Link TV / Leo TV;CS Link:11992:hC34:S23.5E:27500:2624:2625=cze:2626:0:9005:3:3215:0 Spektrum;CS Link:11992:hC34:S23.5E:27500:2640:2641=cze:0:0:9006:3:3215:0 Viasat Explorer / Spice;CS Link:11992:hC34:S23.5E:27500:411:571=cze,651=eng:0:0:9007:3:3215:0 Viasat History;CS Link:11992:hC34:S23.5E:27500:412:572=cze,652=eng:0:0:9008:3:3215:0 JimJam;CS Link:11992:hC34:S23.5E:27500:413:573=cze,653=eng:0:0:9009:3:3215:0 Nova Cinema;CS Link:11992:hC34:S23.5E:27500:2656:2657=cze:2658:0:9010:3:3215:0 Z1;CS Link:11992:hC34:S23.5E:27500:2672:2673=cze:2674:0:9011:3:3215:0 NOSTALGIA;CS Link:11992:hC34:S23.5E:27500:409:569=slk:0:0:9012:3:3215:0
Xine umí přehrávat pěkně, na jeho bázi je postaveno i několik alternativních přehrávačů. Pouze potřebuje nahrát soubor channels.conf do adresáře ~/.xine. Potom se v nabídce objeví DVB volba a kanály se přepínají PageUp a PageDown nebo kolečkem myši. Další volba se xine dvb://CT1_1.
Mplayer potřebuje nahrát channels.conf do ~/.mplayer a dále podobně, jako Xine mplayer dvb://CT1_1. Mplayer má ještě tu výhodu, že umí přehrávat stream ze sítě mplayer udp://@239.194.10.11:1234. To mi nejde, takže používám mplayer -cache 4096 rtp://@239.194.10.13:1234 pro streamy z vlastního VLS a cca 10 Mb cache pro streamy z Internetu. Ale nejčastěji stejně sleduji přes VLC ;-)
Klear je hodně dobrý program pro digitální televizi v linuxu. Velmi rychle se vylepšuje, právě je verze 0.5.4. Stačí mu nahrát channels.conf do ~/.klear a jede. Autoři plánují integrovat skenovací funkci, takže za chvíli bude umět sám skenovat okolí. Oproti předchozím dvěma umí také EPG. Pro kompilaci jsou potřebné qt, kde (base), scons a postup podle návodu :-)
Kromě utilitky na skenování a utilitky na zachytávání signálu obsahuje i plno dalších věcí, které zjistí traffic nebo PIDy kanálu.
DVB tools obsahují DVBstream a DVBtune, což jsou užitečné věci při práci se signálem. Streamování touto utilitkou není nic moc. Nedají se použít rpm balíčky, je nutné kompilovat a v souboru dvb_defaults.h přepsat parametry vysílání na místní poměry.
Video Disk Recorder je program pro sledovaní a nahrávání pořadů z digitální televize. Prakticky je to multifunkční domácí video, které jde rozšířit o mnoho pluginů. Pro streamování jsou zajímavé streamdev a sc.
O streamování TV signálu je celý server www.videolan.org. Doporučují používat VLC, ale dávám přednost VLS.
VLC mi funguje správně pod WindowsXP i v linuxu. Pro Ubuntu VLC z repositáře nebo vlastní build. VLC trpí úniky paměti při multicastovém streamování, takže pokud možno je výhodnější použít "rock stable" VLS, ač to jde bez patchování jen se starším DVB API. Raději používám VLS jako server a VLC jako klienta (linux i Windows).
VLS je streamovaní server určený pro streamování DVD a DVB. Jeho vývoj byl bohužel ukončen a část byla integrována do VLC. Poslední opravená verze je 0.5.6. Jeho kompilace je složitější ;-)
--- ./src/core/library.cpp.tv 2004-06-30 18:58:00.527941222 +0200 +++ ./src/core/library.cpp 2004-06-30 18:58:45.777047645 +0200 @@ -25,7 +25,7 @@ * *******************************************************************************/ - +#include <dlfcn.h> //------------------------------------------------------------------------------ // Preamble @@ -79,7 +79,7 @@ # ifdef RTLD_NOW m_hHandle = dlopen(m_strName.GetString(), RTLD_NOW); # else - m_hHandle = dlopen(m_strName.GetString(), DL_LAZY); + m_hHandle = dlopen(m_strName.GetString(), RTLD_LAZY); # endif if(m_hHandle == NULL) { --- ./src/core/hashtable.h.tv 2004-06-30 18:53:44.712993043 +0200 +++ ./src/core/hashtable.h 2004-06-30 18:53:13.241614538 +0200 @@ -63,7 +63,7 @@ }; -class C_HashMethod<u32> +template <> class C_HashMethod<u32> { public: inline C_HashMethod(u32 uiMaxHash); @@ -76,7 +76,7 @@ }; -class C_HashMethod<u16> +template <> class C_HashMethod<u16> { public: inline C_HashMethod(u32 uiMaxHash); @@ -89,7 +89,7 @@ }; -class C_HashMethod<handle> +template <> class C_HashMethod<handle> { public: inline C_HashMethod(u32 uiMaxHash); --- ./src/core/stream.cpp.tv 2004-06-30 18:59:00.374759370 +0200 +++ ./src/core/stream.cpp 2004-06-30 19:01:02.921339327 +0200 @@ -317,6 +317,8 @@ template <class IOStream> C_Stream<IOStream>& C_Stream<IOStream>::operator >> (C_Serializable& cObject) { + C_ClassDescription cObjectDescription = cObject.Reflect(); + C_Serializer cSerializer(&cObject, cObjectDescription); try { u32 iByteCount = cSerializer.NextBytesCount(); @@ -324,11 +326,12 @@ { const byte aBytes[iByteCount]; u32 iOffset = 0; + int iRc; // Read the data to deserialize on the stream do { - int iRc = m_pIOStream->Read(aBytes+iOffset, iByteCount-iOffset); + iRc = m_pIOStream->Read(aBytes+iOffset, iByteCount-iOffset); ASSERT(iRc >= 0 || iRc == FILE_EOF); iOffset += iRc; }
global configuration -------------------- system : linux-gnu architecture : i686 debug : 0 profiling : 0 vls configuration ----------------- vls version : 0.5.6 debug mode : 0 system logging : 1 daemon mode : built-in modules : filechannel netchannel filereader ts2ts ps2ts localinput videoinput plug-in modules : dvbinput dvbreader
Co se bude streamovat se nastavuje ve dvou souborech: ~/.dvbrc (parametry vysílače) /usr/local/etc/videolan/vls/vls.cfg (parametry pro vls).
Parametry do ~/.dvbrc se musí vložit ručně. Toto je nastavení pro vysílání DVB-T na 25. kanále CRa a několik prvních programů. V případě, že tyto hodnoty nefungují, lze podle /usr/include/linux/dvb/frontend.h nastavit parametry správně. První zmiňovaná podporovaná možnost má vždy hodnotu 0.
LNB ID 1 TYPE 2 SAT ID 1 NAME "DVBT-Prague" LNBID 1 FMIN 500000000 FMAX 778000000 TRANSPONDER ID 0001 SATID 0001 TYPE 2 FREQ 506000000 BANDWIDTH 0 HP_RATE 2 LP_RATE 2 MODULATION 1 TRANSMISSION_MODE 1 GUARD_INTERVAL 3 HIERARCHY 0 CHANNEL ID 0 SATID 1 TPID 1 SID 0 TYPE 0 CHANNEL ID 1 NAME "CT1.A" SATID 1 TPID 1 SID 1 TYPE 0 CHANNEL ID 2 NAME "CT2.A" SATID 1 TPID 1 SID 2 TYPE 0 CHANNEL ID 3 NAME "CT24.A" SATID 1 TPID 1 SID 3 TYPE 0 CHANNEL ID 4 NAME "NOVA.A" SATID 1 TPID 1 SID 4 TYPE 0
Poté se pomocí utilitky satscan z libdvb spustí: ./libdvb-0.2.2/satscan ~/.dvbrc a nalezené kanály uloží, případně pojmenují. Novější verze libdvb vytvoří komplexnější ~/.dvbrc, který lze použít pro VLC, ale VLS jej nepotřebuje.
Konfigurační soubor VLS se musí upravit podle požadavků. Klíčová nastavení:
# vls.cfg - configuration file (example DVB-T) ... # Streams sources declaration BEGIN "Inputs" # --- Format: # InputName = "Type" # --- Example: # local1 = "local" # Local input example # kfir = "video" # Video input example (mpeg encoder) dvb = "dvb" # Video input example (DVB card) END ... # Video input (DVB) configuration BEGIN "dvb" # --- Example: DeviceNumber = "0" # /dev/dvb/adapter<i> SendMethod = "1" # 0 - Send All Pids # 1 - Send only MPEG2 datas END ... # Channel (outputs) declaration BEGIN "Channels" # --- Format: # ChannelName = "Type" # --- Example: # localhost = "network" # client1 = "network" # client2 = "network" multicast1 = "network" multicast2 = "network" multicast3 = "network" multicast4 = "network" END ... BEGIN "multicast1" # multicast CT1.A Type = "multicast" TTL = "20" # Time To Live DstHost = "239.194.10.11" # multicast address DstPort = "1234" # destination port END ... BEGIN "LaunchOnStartUp" command1 = "start CT1.A multicast1 dvb --rtp" command2 = "start CT2.A multicast2 dvb --rtp" command3 = "start CT24.A multicast3 dvb --rtp" command4 = "start NOVA.A multicast4 dvb --rtp" END
Na každý multiplex je potřeba zvláštní DVB-T karta, protože tuner může být naladěn pouze na 1 frekvenci. Nelze tedy volně kombinovat streamované programy. VLS zvládá i více DVB karet a není problém streamovat více multiplexů.
VLS se pouští jednoduše vls -vvv, aby byl přehled o chybách. Někdy zahlásí libdvbpsi chybu v příjmu signálu, ale bez problémů streamuje dál. Síla signálu je okolo 60 % (podle Windowsové aplikace, v linuxu se síla signálu neměří relativně). Průměrně zabírá streamování jednoho programu 600 - 620 kB síťového provozu (multicast).
miniSAP server je služba pro klienty o vysílaných programech. Na webu VideoLAN je ke stažení. Instalace je jednoduchá, následně stačí upravit konfigurační soubor a spustit server třeba jako démona.
Update: upravte broadcast.cpp řádek 111 setsockopt(fd6...,) na setsockopt(fd4...) a sapserver.cpp řádek 225 udává zdrojovou IP definici jako 1.2.3.4.
S rozdělením programové nabídky multiplexů A a B od 1.1.2006 je pro příjem všech dostupných programů potřeba použít 2 DVB-T karty - tedy Aver 771 a AirStar2. Díky tomu, že je AirStar2 pro signál průchozí (a navíc digitální signál nejspiše i zesílí), lze tyto dvě katry zapojit do série. Zapojení paralelně poskytuje horší signál. Aby se karty vzájemně co nejméně ovlivňovaly, je potřeba odzkoušet instalaci do různých slotů.
Jelikož mají tyto dvě karty stejný frontend mt352, bez dohledu se někdy frontendy adapteru0 a adapteru1 prohodí. Osvědčila se mi následují kombinace:
rmmod bttv modprobe skystar2 modprobe mt352 modprobe bttv modprobe dvb_bt8xx
Tím se kvalitnější karta AirStar2 stane zařízením /dev/dvb/adapter0 a horší karta /devb/dvb/adapter1.
Vysílání multiplexu B někdy vypadává a tím shazuje vlsd. Proto je vhodné upravit (Device Number,....) a rozdělit konfigurační soubor na dva nezávislé a pouštět dva démony vls. Následně je potřeba vytvořit .dvbrc.1 pro druhou kartu. Server se poté spouští přikazem
vlsd -f /usr/local/etc/videolan/vls/vls0.cfg vlsd -f /usr/local/etc/videolan/vls/vls1.cfg
Nejjednodušší varianta je streamovat multicast pomocí VLC. To bohužel není až tak jednoduché, protože VLC nespolupracuje s multiproto API, a tak nic nenaladí. Stejně je na tom VLS, který by teoreticky dokázal streamovat z předladěného transpodéru, ale takové řešení se nevyplatí.Řešením by mohly být dva přístupy:
getstream je jednoduchá utilitka a lze ji zkompilovat s patchem pro DVB-S2 patch pro getstream nebo si vybrat novější verzi podporující multiproto. Hodí se pro testování a krátkodobé streamování v jednoduché síti. Po delším provozu zahlcuje server nesmyslnými požadavky, nezvládá pořádně TTL, a tedy neprojde přes switche/routery, a nakonec je obraz nedívatelný.
O VDR je napsán podrobný a pěkný návod na www.her-ur.org, plno informací je také na www.cssf.cz. Ke streamovacím účelům je potřeba zkompilovat VDR minimálně s pluginy streamdev pro základní streamování a sc pro přístup k dekódovací kartě, samozřejmě s multiproto_plus podporou. Tím člověk získá aplikaci, která umí streamovat přes http a to i kódované kanály z karty. Řešení je to vhodné pro domácnost, kde nejsou nároky na současné sledování vícero kanálů. Běžně finančně dostupné dekódovací moduly jsou ochotné rozkódovávat 1-2 programy současně, což není nic pro streamování celého kódovaného transpodéru. Také http streamovací možnosti jsou omezené co do počtu obsloužitelných klientů. Řešením je pořízení čtečky karet (třeba Smouse/Phoenix) a obsluha karty pomocí cardserveru (libovolný podle chuti). V případě vyšších požadavků (více karet, více transpodérů, více všeho) je vhodnější využít služeb sasc-ng.
Jelikož http stream není pro síť žádné terno, je vhodnější použít multicast. VDR bohužel multicastový plugin nemá. Existuje zárodek multicastové podpory mcast, dále původní verze stremdevu uměly jednoduchý multicast. Kdyby se někomu chtělo, konfigurovatelný VDR multicast-streaming plugin by se hodil ;-)
Řešením je kombinace VDR a VLC streamování. Pro úspěšné streamování DVB-S (DVB-S2) jsou potřeba tyto fungující součásti:
Základem je VDR posílající kanály pouze na localhost jako http stream, odkud je přebírá VLC a rozesílá je (transkodované) do sítě jako multicast. V této konfiguraci jsem narazil na problém, že streamování nevydrželo do rána. A na vině byl VLC a jeho nikdy neopravené úniky paměti :-( Dotazováním strýčka Googla jsem lokalizoval problém jako chybu ve ffmpeg komponentě VLC. Naštěstí může VLC streamovat mpeg2 i bez ffmpeg, a tak jsem zkompiloval vlastní VLC pouze na účelem re-streamování.
Vybral jsem si stabilní verzi 0.8.6 a zdrojový balíček pro Ubuntu 8.04. VLC jsem nakonfiguroval takto:
./configure --prefix=/usr --enable-optimizations --enable-sse --enable-mmx --enable-vlm --enable-sout --enable-lua --enable-dvb // --enable-pvr --enable-gnutls --enable-httpd --disable-mad --enable-freetype --enable-fribidi --enable-nls --enable-libxml2 // --enable-libdvbpsi --enable-libmpeg2 --disable-wxwidgets --disable-skins2 --disable-ffmpeg --disable-faad
Povolené jsou optimalizace, využití VLM, DVB, httpd, libdvbpsi a libmpeg2. Zakázaný ffmpeg, live555 apod. jsem ani neuvažoval. Zbytek jsem buď zakázal nebo doinstaloval podle toho, co chybělo při kompilaci.
Nechtělo se mi cpát všechny parametry do příkazového řádku, a tak jsem raději zvolil VLM a ovládání buď telnetem nebo příjemněji přes http interface VLC. VLC spouštím příkazem:
vlc -d -vvv --http-caching 500 --color -I telnet --rtsp-host localhost:5678 --vlm-conf /home/ondra/myTV.vlm --ttl 12
a konfigurační VLM soubor obsahuje:
####################################################### # VLM konfigurační soubor pro DVB-T mux A+B+C a DVB-S(2) Astra3A (23.5°E) a analog ####################################################### ###### DVB-T #..... # výřez ze satelitních programů new TA3 broadcast enabled setup TA3 input http://localhost:3000/PES/s23.5e-3-3015-8005 setup TA3 output #rtp{mux=ts,dst=239.194.11.15} new ARTE broadcast enabled setup ARTE input http://localhost:3000/PES/s23.5e-0-1051-28724 setup ARTE output #rtp{mux=ts,dst=239.194.11.16} # pro 2 DVB-S karty a VDR # jako první spustit kanál z 1. transpodéru, jako druhý spustit kanál z druhého transpodéru, a pak zbytek z 1. transpodéru a zbytek z 2. transpodéru # VDR by jinak na druhé kartě naladil opět frekvenci 1. transpodéru control TA3 play control ARTE play # #..... ###### DVB-S # starší VLM záznam pro mux A new CRa broadcast enabled setup CRa option programs=1,2,3,4,5 setup CRa input dvb-t:adapter=0:budget-mode=1:frequency=506000000:inversion=2:bandwidth=8:code-rate-hp=2:code-rate-lp=0:modulation=64:transmission=8:guard=8:hierarchy=-1 setup CRa output #duplicate{dst=std{access=udp,mux=ts,dst=239.194.10.11:1234},select="program=1",dst=standard{access=udp,mux=ts,dst=239.194.10.12:1234},select="program=2",dst=standard{access=udp,mux=ts,dst=239.194.10.13:1234},select="program=3",dst=standard{access=udp,mux=ts,dst=239.194.10.21:1234},select="program=4",dst=standard{access=udp,mux=ts,dst=239.194.10.14:1234},select="program=5"} control CRa play #..... ###### analog # a tam, kde není digitální pokrytí new analog_CT1 broadcast enabled setup analog_CT1 input v4l:// setup analog_CT1 option size=640x480 setup analog_CT1 option v4l-vdev=/dev/video0 setup analog_CT1 option v4l-norm=2 setup analog_CT1 option v4l-frequency=510750 # audio běží jen s v4l2 VLC 0.9.x setup analog_CT1 option v4l-adev=/dev/mixer:line setup analog_CT1 option v4l-audio=0 # raději použít TRANSCODE #setup analog_CT1 output #duplicate{dst=std{access=udp,mux=ts,dst=239.194.12.11:1234}} #control analog_CT1 play #...
VLC klient používá k přehrávání playlist o této struktuře:
#EXTM3U #EXTINF:-1,CT 1 #EXTVLCOPT:udp-caching=500 #EXTVLCOPT:filter=deinterlace #EXTVLCOPT:vout-filter=deinterlace #EXTVLCOPT:deinterlace-mode=blend #EXTVLCOPT:meta-title=CT 1 #EXTVLCOPT:meta-description=CT 1 v multiplexu CRa udp://@239.194.10.11 # #EXTINF:-1,TVB1_Brno_net #EXTVLCOPT:mms-caching=500 #EXTVLCOPT:filter=deinterlace #EXTVLCOPT:vout-filter=deinterlace #EXTVLCOPT:width=1024 #EXTVLCOPT:width=768 #EXTVLCOPT:deinterlace-mode=blend #EXTVLCOPT:meta-title=TVB1_net #EXTVLCOPT:meta-description=TVB1_net mms://213.211.43.211/live
Poděkování...
Odkazy