Linux E X P R E S

Facebook

Nahrávání televize

V mém konzolovém podání ...


Situace

Hledal jsem možnost jak jednoduše nahrávat televizní pořady na jednom vzdáleném počítači. Moje požadavky byly takové, abych mohl nejlépe jedním (konzolovým) příkazem nastavit nahrání pořadu a až se mi to bude hodit, odnesl si výsledek např. ve formátu Xvid v co nejlepší kvalitě a nejmenší velikosti...

Skenování stanic a mplayer

Nejdřív jsem musel zjistit, které stanice jsou na jakých kanálech a kde je ten nejlepší signál. K nalezení stanic jsem použil nástroj scantv. Jednoduše stačí zadat tento příkaz a postupovat podle průvodce, tzn. zadat normu (0 - PAL) a tabulku používaných frekvencí (6 - europe-east). Program mi nicméně ve výchozím nastavení napsal

vbi: open failed [/dev/vbi]
open /dev/vbi: No such file or directory

což jsem opravil snadno nastavením parametru příkazu takto

scantv -C /dev/vbi0

Pokud se podaří najít stanici, pak program vypíše něco takového:

R6   (175.25 MHz): ???
[unknown (R6)]
channel = R6

zatímco u ostatních kanálů je hláška no station. Kanály se signálem jsou pro nás zajímavé, jejich obsah si přehrajeme zadáním příkazu

mplayer tv://R6 -tv driver=v4l2:device=/dev/video0:chanlist=europe-east:alsa:adevice=hw.1,0:amode=1:audiorate=32000:forceaudio:volume=100:immediatemode=0:norm=PAL -af channels=2:2:0:0:0:1 -mc 0

ne všechny volby budou určitě nutné a zároveň se to může lišit v závislosti na vašem HW. Tak např. volbu

-af channels=2:2:0:0:0:1

můžete směle vypustit a používá se výlučně v kombinaci s televizí Nova, kdy vám tato volba zajistí, aby byly všechny pořady v češtině (Nova standardně posílá "více zvukových proudů" - správně řečeno, a pokud se nepletu, tak ve dvoukanálovém zvuku je jeden kanál pro originál a ten druhý pro český dabing)

Máme stanice, jdeme nahrávat

Skript pro nahrání televize může vypadat např. takto

#!/bin/bash

mencoder tv://R6 -tv driver=v4l2:device=/dev/video0:chanlist=europe-east:alsa:adevice=hw.1,0:amode=1:audiorate=32000:forceaudio:volume=100:immediatemode=0:norm=PAL -mc 0 -oac pcm -ovc lavc -lavcopts vcodec=mjpeg -af channels=2:2:0:0:0:1 -o $1

Tzn. oproti klasickému přehrávání pomocí mplayer téměř žádná změna. Jen je třeba nastavit použitý kodek, do kterého se bude video ukládat. Tady jsem na doporučení ostatních použil mjpeg, který není náročný na CPU a tak zvládne ukládat bez zahozených snímků (to by způsobilo rozchod zvuku a obrazu) a přitom kvalita je téměř stejná jak u klasického přehrávání.

Soubor si pak můžete pojmenovat např. nahraj_nova a zavolat takto

nahraj_nova agent_007.avi

Skriptu se tedy předává parametr v podobě jména výsledného souboru. Bezprostředně po jeho spuštění pak dojde k nahrání pořadu a toto nahrávání je nutno ukončit stiskem klávesy CTRL + C.

Trocha té automatiky

Takhle by to sice šlo, ale s pohodlím nahrávání na videu to nemá nic společného, takže pojďme si to vylepšit. Nejsem úplný odborník na skriptování, takže jsem si nakonec udělal skripty dva a využil přitom předchozí skript. Nejdřív to jednodušší, skript nahrani_televize, který volám když chci nahrát nějaký pořad

#!/bin/bash

echo "/home/martin/bin/nahrani_televize2 $3 $4 $5 &>/dev/null" | at $1 $2

Skript se volá takto:

nahravani_televize 13:00 10.02.08 120 nova agent_007

Význam je téměř jasný, ve 13:00 dne 10.2.2008 mi nahraj film agent_007, který trvá 120 minut a dávají ho na televizi Nova. K tomu je ještě potřeba skript nahrani_televize2 (uložený v /home/martin/bin), který provede vlastní zapnutí/vypnutí nahrávání.

#!/bin/bash

/home/martin/bin/nahraj_$2 "/mnt/video/$3.avi"  &> /dev/null &

sudo renice -20 `echo $!`

sleep $1m

killall -g nahraj_$2

I když může skript působit záhadně, tak vlastně nedělá nic jiného, než že podle názvu stanice zavolá odpovídající skript (např. nahraj_nova, nahraj_prima, nahraj_ct1, atd...), nastaví mu tu nejvyšší prioritu (;-)), počká stanovený počet minut a pak spuštěný skript zabije (ukončí nahrávání). Výsledné video ukládá do /mnt/video ...

Fajn, výsledek máme, ale co ta velikost

Nejen velikost, ale i index tohoto souboru je poškozen (tzn. nelze se v získaném souboru posouvat vpřed). Jak jinak, než to spravit pomocí dalšího skriptu a naplánovat převod na automatické spuštění pomocí cronu.

Zadal jsem tedy

crontab -e

a do crontabu přidal řádek

0  4  *  *  *  /home/martin/bin/xvid_video2 >/dev/null 2>&1

tzn., ve 4 hodiny ráno (každý den) spusť skript xvid_video2, přitom výstup tohoto skriptu mě nezajímá (tím se vyhnete otravným zprávám v případě, že jste nic nenahrávali, atd ..). Pojďme se podívat co je obsahem souboru xvid_video2 ...

#!/bin/bash

cd /mnt/video

for i in *.avi
do
mencoder -ovc xvid -oac mp3lame -lameopts abr:br=128  -xvidencopts bitrate=1500 -forceidx -ofps 25 -vf scale=512:384,denoise3d=10:3:3 -o hotovo/$i $i
rm $i
done;

V podstatě triviální skript, který vstoupí do adresáře s videem, převede všechny soubory končící na .avi a uloží do podadresáře hotovo, přitom původní soubor odstraní, aby se příště nepřeváděl znovu.

Funguje to

Víc se asi říct nedá. Skripty jsou mé výroby (okopírované "z netu") a celé to běží tak jak chci já, zadám jeden příkaz co, kdy a kde se má nahrát a přitom neřeším zbytek. Jak se to nahraje a kdo to převede mi je jedno, další den, nebo později, si pouze zkopíruju výsledek, na který se pak podívám na počítači, nebo si ho pro změnu převedu pro přehrání do mobilu..

Tímto zápiskem, jsem se nechtěl chlubit, jen ukázat jedno z mnoha možných řešení. ;-)

Diskuze (6) Nahoru