GrabDuck

Streamování DVB-T, DVB-S a analogové TV v linuxu - Aver 771 DVB-T, AirStar 2, TT S2- ...

:

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.


  1. DVB karty pod linuxem
    1. Karta Aver 771
    2. Karta TT S2-3200
  2. Hledání signálu DVB-T
  3. Hledání signálu DVB-S
  4. Aplikace
  5. Streamování DVB-T
    1. VideoLAN client
    2. VideoLAN server
    3. Nastavení streamování
    4. miniSAP server
    5. Streamování ze dvou karet
  6. Streamování DVB-S
    1. Streamování pomocí VLC
    2. Streamování pomocí getstreamu
    3. Streamování pomocí VDR
    4. Kompilace VLC
    5. Streamování z VLC pomocí VLM
  7. Playlist pro VLC
  8. Zdroje

[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]


DVB karty pod linuxem

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:

  1. Hauppauge WinTV NOVA-t budget PCI
    • Bridge: Philips SAA7146A
    • Demodulator: LSI l64781 (Grundig 29504-401)
  2. Avermedia DVB-T 771 PCI
    • Bridge: Brooktree bt878 (Conexant fusion 878A)
    • Demodulator: MT352 (Samsung MT352CG)
  3. TechniSat AirStar 2 TV PCI
  4. TechniSat SkyStar 2 TV PCI rev2.8
  5. TechnoTrend TT-budget S2-3200 + CI
    • Bridge: NXP/Philips SAA7146, tuner STM STB6100
    • Demodulator: STMicroelectronics STB0899

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 Aver 771

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.

TT S2-3200

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

Hledání signálu DVB-T

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

tzap utilitka

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í:

  1. signal je síla signálu: ffff (100%)
  2. snr je signal/noise ratio, čím vyšší, tím lepší, měl by být stabilní, jinak je problém :-(
  3. ber je bit error rate, čím nižsí, tím lepší, opět by měl být stabilní
  4. unc jsou uncorrected blocks, čím nižsí, tím lepší
  5. Přemýšlení v šestnáctkové soustavě není nic moc, a tak pro převod na % síly signálu aj. lze použít skripty signaltest.pl

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

Hledání signálu DVB-S

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

Aplikace

Xine

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

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

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 :-)

linuxtv-dvb-apps-1.1.0

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

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.

VDR

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.


Streamování DVB-T

O streamování TV signálu je celý server www.videolan.org. Doporučují používat VLC, ale dávám přednost VLS.

VideoLAN Client (VLC)

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).

VideoLAN Server (VLS)

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ší ;-)

  1. Je potřeba stáhnou zdrojáky pro vls-0.5.6 (nebo přes svn).
  2. Z téže stránky stáhnout libdvb-0.2.2 (DVB knihovna). Existuje i nová verze libdvb u bratrů Metzlerových, ale ta nemůže být použita, protože VLS nerozumí definici DVB vstupního zařízení v nových verzích.
  3. Další věcí je libdvbpsi (tabulky MPEG TS a DVB PSI). Je možné použít i novější verzi libdvbpsi4-0.1.5.
  4. libdvb-0.2.2 se instaluje pouhým make + make install. Tím se vytvoří jednak knihovny a druhak utilitka satscan.
  5. libdvbpsi se instaluje ./configure --prefix=/usr + make + make install
  6. vls nejde kompilovat přímo na nových strojích, protože obsahuje zastaralé věci v kódu, takže jej zkompilujete určitě na gcc 2.9.x a také na gcc 3.3.5 z Debianu Sarge. Pro kompilaci pod gcc 3.4 existuje patch:
    --- ./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;
    }
    
  7. VLS používám výhradně pro streamování DVB televize, takže DVD věci jsem vyhodil a jejich knihovny ani neinstaloval.
  8. vls se kompiluje třeba takto: ./configure --enable-dvb --disable-dvd --with-dvb=/usr/src/kernels/2.6.13-1.1532_FC4-i686/drivers/media/dvb --with-libdvb=/home/ondra/dvb/vls/libdvb-0.2.2/
  9. výsledek je
    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
    
  10. Dále standardně pomocí make + make install
  11. A VLS je nainstalován.
  12. Update: pro server FC4 s gcc 4.0.2 od Tomáše Thiemela
  13. Je potřeba nainstalovat balíček/kompilátor "GCC32" a samotný ./config spustit takto: "CC=/usr/bin/gcc32 CXX=/usr/bin/g++32 ./configure --enable-dvb --disable-dvd --with-dvb=/usr/src/kernels/2.6.13-1.1532_FC4-i686/drivers/media/dvb --with-libdvb=/home/ondra/dvb/vls/libdvb-0.2.2"
  14. S gcc32 je potřeba zkompilovat (aspoň minimálně) libdvb-0.2.2. Stačí upravit soubor Makefile: Upravit a odkomentovat řádek číslo 2 a 3 (z gcc na gcc32 a z g++ na g++32): CXX = $(ARCH)g++32 CC = $(ARCH)gcc32
  15. A pro jistotu je ještě dobré i libdvbpsi3-0.1.4 zkompilovat s gcc32 (pustit ./configure s proměnnými): CC=/usr/bin/gcc32 CXX=/usr/bin/g++32 ./configure.

Nastavení streamovaných programů

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

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.


Streamování ze dvou karet

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

Streamování DVB-S

Streamování pomocí VLC

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:

  1. Ne moc čistý multiproto patch přidávající do multiproto zpětnou kompatibilitu. Mně nefunguje.
  2. Komplexní vlc patch, který do VLC přidává extra struktury pro DVB-S2. Nejde zkompilovat jen tak s nějakým VLC, je potřeba použít revizi blízkou datu uveřejnění patche. I přes to mi VLC odmítalo pracovat s DVB zařízením. Kdyby někdo našel řešení dřív, než se multiproto dostane do jádra, dejte mi prosím vědět.

Streamování pomocí getstreamu

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ý.

Streamování pomocí VDR

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:

  1. Fungující DVB-S2 karta(y) s CI slotem
  2. Dekódovací kartu a dekódovací modul do CI slotu nebo vhodnou čtečku a cardserver
  3. VDR s pluginy
  4. VLC

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í.

Kompilace VLC

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.

Streamování z VLC pomocí VLM

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
#...

Playlist pro VLC

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

Zdroje

Poděkování...

  • Pavel Dobiáš - za pomoc s nastavením VLS a informace o DVB
  • thanks neoclust[mandriva.org] - for his vls-0.5.6-gcc34.patch
  • Tomáš Thiemel - kompilace na FC4 s gcc 4.0.2

Odkazy

  1. www.linuxtv.org/wiki/index.php/Supported_DVB_cards podporované karty
  2. www.abclinuxu.cz/hardware/dir/52929 HW na AbcLinuxu
  3. www.linuxtv.org/downloads/linuxtv-dvb-apps-1.1.0.tar.bz2 dvb-aplikace
  4. České radiokomunikace
  5. Český Telecom
  6. Czech Digital Group
  7. Klear DVB-T přehrávač
  8. www.videolan.org server o streamování
  9. www.metzlerbros.org/dvb/index.html stránky bratrů Metzlerových
  10. linux.bytesex.org/index.html stránky bttv
  11. www.via.ecp.fr/via/ml/videolan-en.html email archiv VLS/VLC
  12. www.linuxdvb.tv/ DVB věci v linuxu
  13. televize.sh.cvut.cz/index.html DVB-T vysílání na Strahově
  14. tv.pod.cvut.cz DVB-T vysílání v Podolí
  15. www.ok.cvut.cz DVB-T vysílání Orlík
  16. www.cesnet.cz/doc/techzpravy/2004/ DVB projekt CESNETu
  17. Video-on-demand VLS a VLC na czela.net
  18. multiproto driver pro TT S2-3200

 W3C  XHTML 1.1   W3C  CSS 3.0  Ondřej Kuda updated 17. července 2006, DVB-S updated 14. července 2008