úterý 23. června 2009

Streamování pozemní digitální televize DVB-T a VLC

Tak jsme chtěli v práci televizi po síti, až jsme se do toho rovnou dali. Stačil nám jeden starší počítač:

Intel(R) Celeron(R) CPU 2.66GHz
cahe size 256 KB
512MB RAM
120GB HDD
Ati Radeon 9200 PRO
Ethernet:3Com Corporation 3c905C-TX/TX-M 100MBit

Ubuntu server 9.04

a televizní karta Technisat AirStar 2 DVB dnes kolem jednoho tisíce korun. Je určená pro mpeg-2(dvd kvalita), ale z mých zkušeností zvládá i testovací kanály, které jsou v mpeg4(HD). Další výhodou je přítomnost samice pro anténu a samce pro připojení externího zařízení k téže anténě(třeba televize).

Po zasunutí karty i naše serverové jádro(naše 2.6.28.11-server) Airstar rozpoznalo, ačkoliv(podle lspci) jako:
Network controller: Techsan Electronics Co Ltd B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card (rev 02)

...což je obdoba jen pro satelitní vysílání dvb-s.

dmesg | grep DVB
[ 8.060152] DVB: registering new adapter (FlexCop Digital TV device)
[ 8.605099] b2c2-flexcop: found 'Zarlink MT352 DVB-T' .
[ 8.605107] DVB: registering adapter 0 frontend 0 (Zarlink MT352 DVB-T)...
[ 8.605203] b2c2-flexcop: initialization of 'Air2PC/AirStar 2 DVB-T' at the 'PCI' bus controlled by a 'FlexCopIIb' complete

Tuner se registroval klasicky jako Zarlink MT352 DVB-T /dev/dvb/adapter0 a to nám bohatě stačilo(pravděpodobně se jedná o stejný čip).

Co dál? K serveru stačilo doinstalovat VLC a w-scan.

My žádný channels.conf sice nepotřebovali, ale pokud neumíte googlit, můžete si díky němu zjistit veškeré potřebné informace o parametrech vysílání. Zjistíte zde potřebné frekvence multiplexů(pro lenochy zde najdete příslušné kanály. Pro jejich frekvence si už buď zaskenujte nebo zagooglete :-ú)

No a teď už jen vymyslet, jak streamovat. Nainstalovali jsme si zmíněné vlc, které má tu výhodu, že už po instalaci umí dekódovat/kódovat spoustu formátů bez dodatečných kodeků a hlavně, umí spolehlivě běžet jen v terminálu a tak se dá i šoupnout do pozadí či spustit přímo jako démon.
Ale ještě větší hlavně, podpora nejrůznějších druhů zachycovacích zařízení dává tomuto "přehrávači" výsadní postavení mezi open sourceovými výtvory pro přehrávání, převádění nebo streamování videa z externích zařízení.

Stream po HTTP

Pokud se chcete dozvědět o logice posloupnosti parametrů vlc v příkazové řádce, na vlc wiki toho je opravdu hodně. Já sem hodím pouze hotové řešení např, pro ČT http stream v Praze:

vlc --quiet dvb:// --dvb-frequency=730000000 --dvb-bandwidth=8 --ts-es-id-pid -programs=257,258,259,260 --sout #duplicate{dst=std{access=http, mux=ts,dst=:8080/ct1}, select="program=257", dst=std{access=http,mux=ts, dst=:8080/ct2}, select="program=258", dst=std{access=http,mux=ts,dst=:8080/ct24}, select="program=259", dst=std{access=http, mux=ts,dst=:8080/ct4}, select="program=260"}'

Toto si můžete uložit jako např. streamCT, nastavit parametr spuštění a hodit treba do /usr/bin.
Pak po spuštění počítače stačí v řádce napsat streamCT a streamujete.
Klient se může připojit např. takto: vlc http://192.168.1.2:8080/ct1

Stream po UDP:

Pokud Vám nevyhovuje streamování po http protokolu, tedy unicastově, protože třeba počítáte s tím, že se bude připojovat hodně lidí a příliš by to zatížilo síť i systémové prostředky serveru můžete zkusit streamovat po udp protokolu jako multicast.

Z mé zkušenosti je s výše uvedenou konfigurací možno po http streamovat až pro pět lidí čtyři kanály současně(samozřejmě jen jeden multiplex, protože máme jen jeden tuner) bez viditelných problémů s obrazem či zvukem. CPU Vám v tomto případě vyleze na max a system load se zobrazuje v nemožných číslech. Stejně tak, datový tok po síti už je v této chvíli výrazný a pokud máte slabší switch a síťovku, nemusí to být unosné. Do pěti lidí ale opravdu doporučuji stream unicastem.

Multicast je samozřejmě skvělým řešením pro velký počet připojujících se uživatelů, protože server vysílá na Vámi zvolených multicastových adresách prakticky stále stejný objem dat, která se vlastně množí v síti(na switchi) a která přijímají pouze ty počítače, které se registrují do skupiny pro příjem. Ovšem, mluvím spíše o lokální síti, kdy se počítače registrují přes IGMP protokol do skupiny příjemců a je třeba říct, že pod jednou podsítí se multicast chová jako broadcast, tzn. že data se posílají na všechny porty switche(jinak musíte mít přímou podporu ve switchi). Mezi sítěmi se pak uplatňujě PIM protokol.

Takže v malé domácí síti sice budete streamovat ze serveru na mutlicastových adresách, ale data se budou posílat úplně na všechny aktivní porty switche a tím i ke každému připojenému počítači, který je sice přijímat nemusí, ale můžete si tak v krajním případě zahltit switch, nebo nějaký citlivý prvek na síti, který nebude stíhat zahazovat pakety. Jeden multiplex, podle mých zkušeností, znamená kolem 5MB uploadu pro server.
Pokud tedy chcete takto vysílat, pak změňte odpovídající parametry např. takto :
access=udp
dst=mult.adresa(např. 239.255.1.x)

Klient se pak připojí a zaregistruje např. takto: vlc udp://@239.255.1.x

V připadě nějakých nekorektních informací ohledně sítě se omlouvám, ale myslím, že nějak podobně to chodí :-)

2 komentáře:

  1. Dobry den, potreboval bych streamovat TV pres internet (bratr chce v italii sledovat olympiadu v Cj), ale je problem ze moje ani jeho linka na to nema kapacitu (cca 4,5MBit/s). Existuje nejaky enkoder nebo nejaka alternativa k DVBViewer-u, ktera by to zvladala?

    OdpovědětVymazat
  2. Myslím, že dost záleží na rychlosti uploadu. Co píšete je nejspíš rychlost stahování. Odesílání budete mít pravděpodobně o dost nižší, což už je samo o sobě limitující.
    Musel byste podle všeho přistoupit ještě ke konverzi videa(např. do flashe) a to pak streamovat v co nejmenší kvalitě.
    Já osobně dávám mimo domov přednost internetovým p2p aplikacím jako Sopcast nebo TvAnts.
    Bohužel česky to nemluví, ale výběr tam je velmi slušný.

    OdpovědětVymazat