TV grabbing a MPlayer / MEncoder
Tak už jsme si spolu prošli
Poslední, co nám tedy zbývá, je naučit se zachytávat-grabovat obraz z televizní karty. Já k tomu účelu používám
MPlayer, resp. MEncoder.
Pro pořádek uvedu svou sestavu:
- procesor Intel P4 na 1.8GHz,
- 768MB RAM,
- grafická karta Matrox G550 DualHead,
- dva pevné disky Seagate Barracuda 7200rpm [60GB s 2MB cache a 120GB s 8MB cache - ten je opravdu rychlý],
- a samozřejmě to nejdůležitější pro zachytávání TV - mono televizní karta AverMedia TVCapture 98,
- operační systém Mandrake 9.2 s vykompilovaným MPlayerem/MEncoderem 1.0pre3; dřívě jsem rok používal
vykompilovaný MPlayer/MEncoder 0.90rc4 na Mandrake 9.0 a proto se i letmo zmíním o rozdílné syntaxi,
která přišla s jedničkovou verzí.
Jen na okraj podotknu, že MPlayer je The Movie Player for Linux s domovskou stránkou
www.mplayerhq.hu/homepage a MEncoder je The Movie Encoder
for Linux, chcete-li MPlayer-Encoder. Zprovozněním - instalací/kompilací MPlayeru se zde zabývat nebudu, je to
záležitost na samostatný článek. V poslední době je ale již k sehnání RPM balíček s MPlayerem i s MEncoderem
přímo pro Mandrake.
Vyladění obrazu v MPlayeru
Nejdříve se podíváme, co vlastně budeme grabovat - tedy jaké vlastnosti má televizní signál na daném kanále/frekvenci.
Jedná se konkrétně o jas, kontrast, a sytost barev. Osobně používám pro určení programu frekvenci, ale je možno využít
i čísla kanálu či dokonce název programu - viz man mplayer. V Praze mám "ze vzduchu" tyto frekvence:
ČT1.....711.250
ČT2.....631.250
NOVA....599.250
PRIMA...495.250
Frekvence můžete získat např z TV-programu zapping, který v okně pro správu kanálů zobrazuje jak číslo kanálu, tak
příslušnou frekvenci (program je standardní součástí distribuce, případně si ho doinstalujte z RPM balíčku). V jedničkové verzi
MPlayeru použijeme v konzoli (jde o emulátor terminálu, jsme v grafickém prostředí XWindow) příkaz:
mplayer tv:// -tv driver=v4l:input=0:width=768:height=576:freq=599.250:\
brightness=10:contrast=-5:saturation=5 -vop lavcdeint
Znak "\" zde a dále označuje pokračování příkazu v jednom řádku. Ve verzích MPlayeru 0.9x je syntaxe trošičku jiná:
mplayer -tv on:driver=...
Pro MEncoder v následujícím platí tentýž syntaktický rozdíl.
Parametry:
- tv:// - označuje zdroj video-dat na televizní kartu; např. pro přehrávání DVD je to dvd:// atp.
- driver=v4l - je použit ovladač Video 4 Linux
- widht=768
- horizontální rozsah zpracovávaného TV signálu - šířka řádku; 768 je FULL PAL (plný PAL), tedy maximum, co se běžným televizním
signálem přenáší. Některé TV karty zvládnou i číslo větší. Pro full-screen použijte klávesu F, jak je v MPlayeru běžné.
- height=576
- vertikální rozsah zpracovávaného TV signálu; 576 je počet řádků přenášených v běžném PAL TV signálu. Vlastně
se jich najednou přenáší jen 576/2=288 řádků, protože TV přenos je realizován v horních
a dolních půlsnímcích frekvencí 50 půlsnímků za vteřinu (25 fps - Frames Per Second).
- freq=599.250 - frekvence programu ČT1 v mých podmínkách
- brightness=10 - nastavení jasu
- contrast=-5 - nastavení kontrastu
- saturation=5 - nastavení sytosti barev
- -vop lavcdeint - postprocesingový deinterlace filtr z video-knihovny lavc, který zajišťuje
odstranění zubatého obrazu způsobeného prokládáním půlsnímků. Schválně si vyzkoušejte tento parametr vynechat. Výsledek
bude následující:
Pokud jde o parametry šířky a výšky zpracovávaného obrazu, pak můžete volit různě, ale měli byste dodžovat jejich
správný poměr šířka:výška=4:3. Pokud váš systém nestíhá 768:576, zkuste 384:288, což je poloviční PAL. Deinterlace
filtr pak není potřeba. Nastavte si jas, kontrast a sytost barev na vyhovující úrovně a můžeme přistoupit
ke grabování.
Zachytávání TV obrazu MEncoderem
Předem bych vám doporučil spustit si nějaký monitorovací software (např. oblíbený gkrellm, který je součástí
standardní distribuce), abyste mohli pozorovat zatížení procesoru a případně disku a podle toho upravit parametry pro
grabování. A pustíme se rovnou do toho:
mencoder tv:// -tv driver=v4l:input=0:width=768:height=576:freq=599.250:\
brightness=10:contrast=-5:saturation=5 -vop lavcdeint\
-o Film.TV.avi -oac copy -ovc lavc -lavcopts vcodec=mjpeg
Parametry:
- -o Film.TV.avi - název výstupního souboru s videem
- -oac copy - zvuk se nebude enkódovat, bude kopírován ve formátu 'uncompressed PCM', u mě mono
- -ovc lavc - video se bude enkódovat za použití video-knihovny lavc
- -lavcopts vcodec=mjpeg - nastavení parametrů pro lavc, zde se určí jen kodek na MJPEG (Motion JPEG)
s proměnlivým datovým tokem - bitrate, který si MEncoder řídí sám podle náročnosti obrazu. Můžete experimentovat
i s jinými kodeky z "knihovny" lavc, jejich seznam najdete v man mplayer v sekci '-lavcopts' a podsekci
'vcodec=' -z mého podledu je manuálová stránka MPlayeru od 1.0 verze dost nepřehledná tím, že z ní
zmizela tabelace; do kodeků v lavc přibyly nové oproti 0.9x verzi, např. MPEG1/2
Pokud máte mencoder a TV kartu správně "rozchozené", v konzoli se vám zobrazí několik řádků výpisů a na posledním řádku
budete moci sledovat počet nagrabovaných sekund a snímků, FPS, bitrate videa a audia:

Nezmenšené písmo v konzoli, moje rozlišení monitoru 1280x960
Z reproduktorů se vám poline zvuk právě grabovaného TV programu. Sledujte nějakou dobu vývoj zatížení procesoru a práci
disku. Pokud systém nestíhá (zatížení procesoru či disku byť jen na chvíli dosáhne maxima), nejprve slevte z parametru -vop lavcdeint. Prokládání můžete odstranit při následném
enkódování videa. Ale kvalitativně lepší výsledky dává deinterlace již při grabování. Pokud i tak váš systém nestíhá,
zvolte menší nastavení obrazu než je FULL PAL. Na mé sestavě při výše uvedeném příkazu je procesor zatížen okolo 50-60% a
disk s 8MB cache si blikne jednou za čas. Grabování regulérně ukončíme v konzoli stiskem CTRL+C.
Spotřeba místa je při těchto parametrech cca 60MB na minutu - MJPEG v real-time režimu nemá příliš vysokou kompesi a navíc chceme zachovat
co nejvíce detailů pro následné enkódování videa. Dvouhodinový záznam tak podle náročnosti obrazu (akční scény spotřebují
více dat) zabere 6-11 GB na disku. Ano ano, je to hrůza. A hned se MPlayerem můžeme podívat na nagrabovaný výsledek.
Pokud se vám obraz trhá, je třeba slevit z parametrů pro zachytávání. Než se pustíte do ostrého grabování oblíbeného
filmu, doporučuju si zkušebně nagrabovat dvě hodiny a na tomto pokusném videu si ověřit synchronizaci audia a videa -
jestli se video nezpožďuje za audiem. MPlayer má tento problém velmi solidně vyřešen, problémy nastávací při slabší
hardwarové konfiguraci. Výsledné několikagigové AVI záznamy však mívají zhroucený index (právě kvůli objemu dat nad 2
GB) - je to problém AVI formátu, který je odstraněn v OpenDML AVI. MPlayer nemá problém takovýto AVI soubor
přehrát, nelze se v něm však posouvat. To řeší následující příkaz
mplayer Film.TV.avi -idx
který nejdříve vytvoří index pro celý AVI soubor (podle objemu dat v řádech GB to zabere několik minut, o průběhu
jste informováni přibývajícími procenty) a pak se pustí do přehrávání. Teď už se ve videu lze posouvat. Nemilou
záležitostí však je, že MPlayer se zasekne, jakmile překročí hranici cca 4GB v přehrávaném souboru. Čím to je,
netuším. Nezbyde než vyčkat
nějakou tu minutu u ztuhlého obrazu, než se MPlayer sám korektně ukončí. Nicméně vždy je možné se posunout na pozici
40-60min záznamu, což je už dost dlouhá hrací doba na to, abyste si důkladně prohlédli, zda audio a video jsou
perfektně zesynchronizovány, jestli se vám náhodou obraz nezpožďuje za zvukem. Pokud je synchronizace špatná, je
třeba grabovat s nižším zatížením procesoru. Pokud ani to nepomáhá, je třeba poohlédnout se po řešení na internetu :o)
Já jsem se s tímto problémem setkal jen při použití dodatečných vyhlazovacích a ořezávacích
filtrů už při grabování, kdy zatížení procesoru vylítlo na 90-100% a obraz se po hodině zpožďoval za zvukem asi o vteřinu. Při grabování
výše uvedeným příkazem však se synchronizací nemám nejmenší potíže, proto jsem nikdy nemusel hledat řešení tohoto
problému. MEncoder disponuje parametrem -framedrop, ale jeho funkčnost jsem neměl z výše uvedeného důvodu možnost
vyzkoušet.
Jakmile spustíte grabování, MEncoder si "rezervuje" TV tuner a není možné současně grabovaný obraz ani
jiný program sledovat a to ani v jiném software. Zatím jsem nepřišel (rozuměj řádně se nezajímal) jak na to.
Osobně při grabování na počítači vůbec nepracuju, abych se tak vyhnul riziku vypadávání snímků či "rozjetí"
audia a videa. Někdo v diskusi navrhoval xawdecode, tak to můžete vyzkoušet a napsat další článek :o)
Další parametry pro MEncoder:
- -endpos X:X:X - ukončí grabování po stanovené době, např. 20min je 0:20:0, 1h15min10sec je 1:15:10
- -framedrop - u pomalých systémů povolí vypadávání snímků, aby udržel audio-video synchronizaci
- -vop pp=lb - je alternativa místo -vop lavcdeint; jde o linear blend deinterlacer a
subjektivně mi připadá, že obraz je vyhlazenější; volba pp má širší možnosti postprocesingu, viz man mplayer;
seznam dostupných filtrů zjistíte pomocí mplayer -pphelp
- -tv driver=v4l:input=0:alsa:forcechan=2:... - takto, i když mám mono TV kartu, dostanu video se stereo zvukem. K tomu je
však nutné mít jiný, stereo TV tuner, např. videorekordér. Jeho stereo audio výstup pak zapojíte do Line-In vaší
zvukové karty (např. pomocí kabelu, který ma na jedné straně dva RCA/cinch konektory a na druhé stereo-jack),
nastavíte v Linuxu audiomixér tak, aby bral signál z Line-In, a pomocí parametrů alsa:forcechan=2
přinutíte MEncoder, aby graboval stereo audio ze zvukovky (bez ohledu na to, jaký zvuk hlásí a generuje TV tuner). Že
máte vše spávně zapojeno poznáte tak, že zvuk televizního programu nastaveného na videu slyšíte přes počítač pořád, ačkoli
žádná aplikace neběží. Já to kombinuju navíc i s parametrem input=1, kdy TV karta posílá MEncoderu
nikoli jí samotnou dekódovaný TV signál z anténního vstupu, ale video-signál z kompozitního vstupu TV karty, který do
ní přivádím z videa (přes scart výstup videa redukcí na composite/S-video a RCA-RCA kabelem). Obraz bývá kvalitnější, vyhlazenější. Bohužel
moje video nedisponuje S-video výstupem a tak nemůžu použít S-video vstup TV karty (input=2), resp. obraz je
v tomto případě pouze černobílý. Takto grabuju i VHS kazety.

Toto je AverTV 98 Studio - na rozdíl od mé karty je stereo a navíc má rádio tuner, ostatní konektory jsou stejné.

Redukce SCART <--> S-VHS + Composite video + L/R Audio
Následné zpracování nagrabovaného videa
Nehodlám se zde zabývat stříháním videa (jak z něj např. dostat reklamy), to je na samostatný článek. Možná někdy jindy (a hlavně později...).
Navíc pochybuju, že se nějaký software rozumně vypořádá s několika GB AVIčky se zhrouceným indexem.
Budeme postupovat obdobně jako při enkódování DVD obrazu/dumpstreamu. Já používám na všechno zásadně tří-průchodový
postup: 1) audio, 2) video poprvé, 3) video podruhé. Nejprve se alespoň zhruba podíváme, jak by měl a mohl výsledný obraz
vypadat. To znamená, že zdrojový AVI soubor přehrajeme MPlayerem s parametry, které pak zadáme MEncoderu. U mě je to typicky
mplayer Film.TV.avi -vop scale=512:384,denoise3d=10:3:3
přičemž měním parametry u denoise3d, abych dosáhl kompromisu mezi rozmazáním obrazu (ztrátou kontrastu) a odstraněním
zrnění (bohužel nemám nejlepší signál z TV antény). Přesný návod pro použití parametrů denoise3d vám bohužel
nedám - první parametr je stupeň "rozmazání/vystínování" (čím větší, tím víc) nastavuju v rozmezí 5-30, zbylé dva parametry dávám vždy stejné zhruba
na úrovni 30% prvního čísla. Ale věřím, že se dá dosáhnout lepších výsledků v nastavení. Od verze 1.0pre3 máme
k dispozici "high quality" verzi "odstraňovače šumu" - hqdn3d=X:X:X. Parametry jsou stejné, zatížení procesoru
nesrovnatelně vyšší (nehodí se proto pro real-time použití, pokud zrovna nemáte 3GHz procesor nebo 64-bitový stroj :o))).
Pořadí filtrů ve -vop
není libovolné a je v opačném pořadí! Takže nejprve se zdrojový obraz "rozmaže/vyhladí" a pak se zmenší na 512x384 (poměr stran
zachován na 4:3 a oba rozměry jsou dělitelné 32 - vyhneme se tak problémům s některými grafickými kartami). Pokud
bychom pořadí filtrů přehodili, obraz by se nejprve zmenšil a teprve pak by se z něj odstaňoval šum, což podle mého
názoru povede k horšímu výsledku a vyšší ztrátě detailů. Jestliže jste při grabování nepoužili deinterlace filtr, pak
ho přidejte nyní:
mplayer Film.TV.avi -vop scale=512:384,denoise3d=10:3:3,lavcdeint
případně
mplayer Film.TV.avi -vop scale=512:384,denoise3d=10:3:3,pp=lb
Jestliže grabujete z videa, pak z technických důvodů v několika spodních řádcích "ujíždí obraz". Řešením je uřížnout tuto
rušivou část a nahradit ji čeným proužkem. V tom případě použijte:
mplayer Film.TV.avi -vop scale=512:384,denoise3d=10:3:3\
expand=0:-10:0:0,crop=768:566:0:0,lavcdeint
přičemž crop=768:566:0:0 uřízne spodních 10 pixel-řádků a expand=0:-10:0:0 doplní dole černý pruh o výšce
10 pixelů (bez změn v proporcích obrazu), takže výsledný rozměr pro další filtr zůstane 768:576. Černý proužek vám už ale
ve výsledném videu zůstane. Pokud se ho chcete zbavit úplně, vynechejte expand. Nejsem si jist, nakolik má vliv
na kvalitu scale na 512x384 z 768x576 či 768x566, takže možná expand používám zbytečně. Pokud chcete obraz
oříznout kolem dokola (u záznamu z TV se to často hodí, okraje bývají buďto černé nebo rozmazané), použijte např.
crop=758:566:5:5
což obraz ořízne o pět pixelů ze všech stran. Jen poznamenám, že s doplňováním černých krajů po bocích pomocí
expand (jeho první parametr) jsem neuspěl - číslo muselo být sudé, nejlépe násobek 32 a svislé pruhy byly bílé,
nikoli černé.
Když už víte, jak by mělo výsledné video vypadat, přistoupíme k samotnému enkódování. V prvním průchodu zpracujeme jen
audio. Já u filmů používám mono při 64kbit, u hudby-koncertů stereo při 192 popř. 224 kbit (kbit je 1000 bitů za vteřinu, CD
audio má 44100Hz*16bit*stereo = 1411,2 kbit - to je číslo odpovídající -oac copy - "uncompressed PCM",
které vidíte výše na screenshotu konzoly na posledním řádku - [6941:1411]).
První průchod:
mencoder Film.TV.avi -o frameno.avi -ovc frameno -oac mp3lame\
-lameopts cbr:br=64:mode=3:aq=0
Parametry:
- -o frameno.avi - tento název souboru se používá při víceprůchodovém enkódování, kdy se nejprve zpracuje
zvuk a následně video. Soubor -o frameno.avi lze přehrát, je v něm jen zvuk a nelze se v něm posouvat
- -ovc frameno - říká MEncoderu, že nemá zpracovávat obraz, že jde o přípravu zvuku pro více průchodů
- -oac mp3lame - zvuk se bude enkódovat do MP3 pomocí LAME kodeku; jaké možnosti pro -oac
máte, zjistíte pomocí mencoder -oac help
- -lameopts cbr:br=64:mode=3:aq=0 - parametry pro enkódované audio: cbr - Constant BitRate, br - BitRate =64kbit/sec,
mode=3 označuje mono, aq=0 je nejvyšší kvalita enkódování
Po doběhnutí (podle rozsahu zdrojového souboru a výkonu počítače několik minut až desítky minut) vám MEncoder velmi
kamarádsky a velice přesně vypíše doporučení pro bitrate videa pro jedno či dvě 640/700/800MB CD. Já si toto číslo
vždycky zaokrouhlím na celé desítky nahoru (např. 871 na 880) a výsledné video se zaručeně "vleze" do vybrané velikosti. Pokud
film obsahuje reklamy a před a za ním je taky ještě něco, pak je to spíš alchymie a astrologie odhadnout bitrate
pro video. Nejlepší by bylo zdrojový několikagigový soubor nejdříve sestříhat, ale jak jsem psal, toto jsem ještě
nezkoumal (a jsem skeptický, zda to vůbec nějaký software zvládne).
Druhý průchod (první průchod u videa):
mencoder Film.TV.avi -o Film.avi -oac copy -ovc lavc\
-lavcopts vcodec=mpeg4:vbitrate=880:vme=1:vhq:vpass=1\
-vop scale=512:384,hqdn3d=10:3:3,expand=0:-10:0:0,crop=768:566:0:0\
-noskip -mc 0
- -oac copy - říká MEncoderu, že má audio ze zdroje do výsledného souboru jen vložit bez jeho úprav. POZOR!!!
Jestliže máte v adresáři soubor frameno.avi, pak se audio bere z něj, jinak se vezme ze zpracovávaného
souboru
- -ovc lavc - k enkódování videa bude použita "knihovna" MPlayeru/MEncoderu lavc. Jaké
volby máte, zjistíte pomocí mencoder -ovc help
- -lavcopts - nastavení parametrů pro "knihovnu" lavc
- vcodec=mpeg4 - použitý kodek bude DivX4/DivX5, na čem to záleží, netuším :o)
- vbitrate=880 - bitrate/datový tok pro video
- vme=1:vhq - parametry pro nastavení nejvyšší kvality výsledného videa - drasticky zpomalí enkódování,
na mém stroji s vykompilovaným MEncoderem je to 7-8 fps (takže cca 3x pomaleji než je real-time přehrávání)
- vpass=1 - říká, že se bude video enkódovat ve dvou krocích a toto je první průběh, kdy se vytváří
informace o zpracovávaném videu a ty se zapisují do souboru divx2pass.log
; zároveň se vytváří
AVI "meziprodukt" Film.avi
- -noskip -mc 0
- tuto dvojici parametrů jsem kdysi vyslídil v manuálové stránce MPlayeru a od té doby
je používám vždy, když enkóduju video nahrané z TV resp. VHS. V mém případě zajistí bezproblémovou synchronizaci
audia a videa ve výsledném AVI (ovšem pokud i to zdrojové je v pořádku). Bez nich se mi totiž stávalo, že ačkoli
zdrojové video mělo A-V sync v pořádku, výsledné AVI v DivX mělo obraz a zvuk rozjeté. U enkódování videa z DVD se
mi to nestává a tyto dva parametry nepoužívám.
Třetí průchod (druhý průchod u videa):
mencoder Film.TV.avi -o Film.avi -oac copy -ovc lavc\
-lavcopts vcodec=mpeg4:vbitrate=880:vme=1:vhq:vpass=2\
-vop scale=512:384,hqdn3d=10:3:3,expand=0:-10:0:0,crop=768:566:0:0\
-noskip -mc 0
Jediná změna je ve vpass=2. MEncoder tak pozná, že má použít informace ze souboru
divx2pass.log a vytvořit již finální AVI. Osobně dávám příkaz pro druhý a třetí průchod najednou za
sebe na jeden řádek, oddělím je středníkem - použijte schránku/clipboard a nezapomeňte změnit vpass=2 !!!
Proč používat tříprůchodové enkódování? Zvuk se enkóduje
odděleně od videa, což zvyšuje kvalitu výsledku, navíc dostanete odhad pro bitrate videa. Obraz se nejdříve projde a
popíše a poté je akčním scénám věnován větší datový tok než statickým, což zaručí stejnou kvalitu obrazu po celou
hrací dobu (jinak by statické scény vypadaly dobře a u dynamických by kvalita byla horší). Ve finále jde o to, že
při zadaném maximálním objemu dat je obraz co možná nejkvalitnější.
Pokud máte před filmem a/nebo na jeho konci něco, co tam nechcete, můžete to pomocí MEncoderu snadno odstranit. Nejdříve
si pomocí MPlayeru zjistěte začátek a konec filmu v AVI, z toho si dopočtěte délku filmu. Např. AVI má 1h45min, film
začíná na 5min0sec a končí 1h25min0sec, tzn. že má délku 1h20min. Vymažte z adresáře frameno.avi !!!
mencoder Film.avi -o Film2.avi -oac copy -ovc copy -ss 0:5:0 -endpos 1:20:0
Z technických důvodů nebude oříznutí dokonale přesné na vteřinu a občas je potřeba více pokusů, než se přesně trefíte.
MEncoder tak jak je, není nástroj pro stříhání videa a ani si takové ambice neklade.
Nastavení nahrávání z TV ve stanovený čas
Já k tomu používám jednoduchý příkaz at, viz jeho manuálové stránky. Nejdříve si na řádek napíšu příkaz pro
grabování přes MEncoder, pak stisknu CTRL+C, zadám příkaz at čas datum a po odentrování pomocí
schránky vložím na řádek příkaz pro MEncoder, pak ENTER, pak CTRL+D. Nahrávání si tak
můžete nastavit kolik chcete, resp. kolik místa na disku vám zbývá. Nezapomeňte, že ve chvíli, kdy se má začít nahrávat,
nesmí žádná aplikace používat TV tuner!
Tak takto já nahrávám a zpracovávám video z TV karty. Tipy a návrhy vítám.
LINUX
Počítadlo z http://pocitadlo.netway.cz/