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:

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 obraz bez odsdtranění prokládání

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

výpis mencoderu v konzoli
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:

AverTV98 Studio
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-video+composite+audio
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: 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
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

malá ikona

Počítadlo z http://pocitadlo.netway.cz/