Videoregistratolinux
Dopo giorni di smanettamenti vari con la scheda tv analogica, in questo post vi propongo un piccolo script che mi sono creato per poter registrare e programmare registrazioni dalla tv tramite mencoder. Insomma mi sono creato un piccolo videoregistratore digitale, molto più comodo del caro vecchio VHS! Ma meno figo del betamax…
Introduzione
Prima di tutto premetto che io in questo momento sul mio pc con ubuntu (hardy) per guardare normalmente la tv uso tvtime che è davvero un’ottimo programma. Semplice da usare, con un bel menu OSD e una discreta dose di impostazioni smanettabili. Il limite però è che non registra e non fa nessun tipo di timeshifting! Nel caso voi abbiate (a differenza di me) una scheda tv DVB-T o DVB-S allora vi consiglio di usare Kaffeine. Prima che si rompesse la mia, lo usavo ogni giorno e l’ho trovato veramente completo: EPG, registrazione immediata, programmata e timeshifting tutto in uno. Dato però che Kaffeine non sembra digerire la mia nuova (in realtà vecchia) scheda tv analogica, sono dovuto passare ad altro!
Una soluzione naturalmente da tenere in considerazione è quella di usare MythTV. Per chi ancora (ma dove vivi?!) non lo sapesse MythTV è un programma completissimo che permette di creare un sistema completo per la visione della tv, con registrazione e timeshifting, la visione di divx/xvid, la navigazione su internet e tanto altro. Il tutto con un semplice telecomando. MythTV è sicuramente la soluzione più completa per chi vuole dedicare un pc all’uso specifico come PVR (una sorta di clone del TiVo o un Windows MCE venuto bene), ma nel caso in cui l’uso della tv è sporadico e la registrazione avviene solo in certe occasioni, il programma risulta a mio parere un po’ troppo pesante ed invasivo (mille pacchetti e configurazioni eterne).
Requisiti
Lo script (recorder.sh) in pratica fa due cose: registra immediatamente dalla scheda tv oppure programma una registrazione futura.
I requisiti per poter usare questo script sono abbastanza semplici (per uno che usa la scheda tv sulla propria linux box): mencoder (che fa parte di mplayer ed è un favoloso compressore/decompressore/convertitore) e scantv (che fa parte di xawtv).
Configurazione e uso
Veniamo dunque al sodo.
Scantv è un semplice script che esegue, come si intuisce dal nome, una scansione sulla tabella delle frequenze o su tutte le frequenze alla ricerca dei canali tv e li sintonizza in modo che possano essere usati dal software Xawtv che è invece un (piuttosto bruttino e datato) visualizzatore di tv.
Il primo step è dunque (nel caso non l’abbiate già fatto) creare una tabella dei canali:
$ scantv -C /dev/vbi0 -o /home/francesco/.xawtv
Da notare che io devo usare “-C /dev/vbi0″ perchè di default scantv cerca solo su “/dev/vbi”. E che “/home/francesco” è la MIA home… metteteci la vostra! Ah, se volete una ricerca più completa usate anche il comando “-a”… però abbiate pazienza perchè così ci mette una vita!
Una volta conclusa la ricerca, aprendo il file .xawtv troverete una voce che collega un canale (in alcuni casi con il nome) ad una frequenza o un canale. Il canale non è altro che una frequenza prestabilita su una tabella che varia a seconda del paese. In linea di massima i canali tv sono sempre su un canale preciso. Se trovate la frequenza probabilmente si tratta di un canale locale o di qualcosa con una ricezione veramente pessima!
Ora vi consiglio di editare il file per eliminare i canali inutili e per mettere i nomi a quelli che non l’hanno. Per farlo vi basta usare un normale editor per le modifiche sul file .xawtv e xawtv per vedere il risultato. Ora passiamo alla registrazione!
NB. Purtroppo una limitazione piuttosto grave del sistema è che la scheda tv è accessibile solo da un processo per volta. Ciò significa che, se state guardando un canale (ad es. su tvtime) e fate contemporaneamente partire la registrazione (su un altro canale o anche sullo stesso), l’ultimo processo avviato esclude il precedente. Proprio come con un videoregistratore non possiamo cambiare canale mentre registriamo! E per vedere mentre si registra? Bè basta aprire il file video che il nostro fido recorder.sh sta creando con un player qualsiasi. In questo modo abbiamo anche una sorta di timeshifting dato che possiamo metterlo in pausa, mandarlo indietro o avanti (compatibilmente con la linea temporale!!) e farlo ripartire quando vogliamo mentre recorder.sh continua a salvare il flusso video.
L’uso dello script è piuttosto semplice:
$ ./recorder.sh [channel] [seconds] [options] [start]
Dove “channel” è il canale che trovate nel file che abbiamo creato prima (.xawtv), “seconds” sono i secondi della durata della registrazione, “start” è l’ora in HH:MM di inizio della registrazione. Come opzioni è possibile specificare “-f” per aprire immediatamente il file in corso di registrazione in mplayer, “-p” per programmare una registrazione futura (in tal caso è obbligatorio specificare anche “start”). Nel caso in cui “-p” non sia specificato la registrazione parte immediatamente, altrimenti crea una voce “cron” tramite il comando “at” che verrà eseguita nel momento prestabilito. Ad esempio:
$ recorder.sh 56 3600 -p 12:50
Metterà in coda una registrazione per le 12:50 sul canale 56 (che da me è Canale 5) della durata di 3600 secondi = 1 ora.
Lo script provvederà a creare un file, il cui nome è dato dal canale e dalla data e l’ora di inizio della registrazione, compresso in divx con l’audio in mp3. E il tutto in maniera automatica!
Lo script nel dettaglio
Naturalmente non mi aspetto che lo script funzioni o vi vada bene così com’è. Il mondo di linux, si sa, è bello perchè vario! Quindi a seconda della distro che state usando qualche impostazione potrebbe essere diversa… oppure la vostra scheda di acquisizione potrebbe funzionare in modo diverso… oppure ancora potreste volere aggiungere o togliere delle opzioni che io uso.
Dov’è il problema?! Basta smanettare sul codice!
In primo luogo premetto che alcune parti di questo script le ho fatte ispirandomi ad uno script simile che ho trovato da qualche parte su un forum (scusate ma non trovo più il link). Io però ho migliorato alcuni aspetti della compressione del video ed ho aggiunto una serie di opzioni, come il fatto di poter programmare la registrazione.
E’ molto importante controllare che i riferimenti alla scheda video e a quella audio siano corretti. Nel mio caso l’output video arriva da “/dev/video0″ e il sintonizzatore si trova su “/dev/vbi0″. Può darsi che a seconda della distro o a seconda del modulo usato per la vostra scheda queste devices siano in luoghi diversi. Potete controllare direttamente tramite mplayer se state usando gli indirizzi corretti. Ecco come:
$ mplayer tv:// -tv driver=v4l2:input=1:device=/dev/video0:norm=PAL
Un altro aspetto importante da considerare è l’input usato. Nel mio caso la scheda fornisce 3 input. Il primo (0) è l’ingresso composito, il secondo e il terzo (1 e 2) sono l’ingresso TV. Se selezionate un input sbagliato dovreste vedere nero o vedere del rumore video. Una modifica che probabilmente aggiungerò in futuro al mio script sarà la possibilità di impostare l’input in modo da poter usare la scheda per convertire vecchi vhs in digitale.
La seconda cosa importante da configurare (e che mi ha fatto impazzire) è l’imput audio. Ci sono due tipi di schede tv. Quelle che mandano l’audio direttamente su una periferica digitale e quelle che invece usano un cavetto di bypass. Di solito quest’ultime hanno un cavetto “jack maschio – jack maschio” che va collegato all’output della scheda tv e ad un input della scheda audio. In altri casi invece (come nella mia scheda) il bypass è interno e viene usato un cavetto che entra in uno degli input CD della scheda audio.
Nel mio caso se apro “tvtime”, l’audio viene direttamente dall’ingresso CD della scheda audio. Quindi devo intercettarlo dalla scheda audio attraverso ALSA per poterlo registrare. Una prova che potete fare per vedere se anche la vostra scheda funziona come la mia è aprire un canale qualsiasi in “tvtime” o in “xawtv” (o simili) e mettere in muto il canale CD nel mixer. Non dovreste sentire più nulla dalla tv.
Ora lanciate questo comando:
# aplay /dev/dsp1
Dove naturalmente “dsp1″ potrebbe essere nel vostro caso “dsp0″ o “dsp”…. Comunque dovreste sentire in qualità abbastanza pessima l’audio della vostra scheda tv. Bene quell’indirizzo corrisponde a “hw.[x]” in alsa.
Ok adesso vediamo lo script:
#!/bin/bash
echo "Recorder.sh a simple script for mencoder - version 1.2 (05/10/08)"
echo "Made by Ermete Trismegisto (www.nerdsopolis.org)"
echo "-------------------------------------"
if [ ! $1 ] & [ ! $2 ]
then
echo "Usage: $0 [channel] [seconds] [option] [start]"
echo "-------------------------------------"
echo "Channel = channel number -> see scantv output"
echo "Seconds = record lenght in seconds"
echo "Option: -f = follow (see the file while recording)"
echo " -p = planned (plan a recording)"
echo "Start = time in HH:MM of start"
echo "-------------------------------------"
echo "Example: recorder.sh 56 3600 12:50"
echo "It will plan a recording of 1 hour at 12:50 on channel 56"
echo "-------------------------------------"
exit
fi
WIDTH=640
HEIGHT=480
MENCODER=/usr/bin/mencoder
AT=/usr/bin/at
FILE="capture_${1}_$(date +%Y-%m-%d_%H:%M:%S).avi"
AUDIO="-oac mp3lame -lameopts cbr:br=128:mode=0"
VIDEO="-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1500:vhq -vf pp=lb"
DSP="alsa:adevice=hw.1"
TV=" -tv driver=v4l2:width=$WIDTH:height=$HEIGHT:input=1:device=/dev/video0:audiorate=32000:norm=PAL:channel=${1}:$DSP"
if [ "$3" = "-f" ]; then
if [ $4 ]; then
echo "ERROR: Start time is valid only for -p option"
exit
fi
echo "Recording on channel ${1} for ${2} seconds... opening player"
amixer set CD mute
$MENCODER tv:// $TV $VIDEO $AUDIO -endpos ${2} -ffourcc divx -o $FILE & sleep 5 ; gmplayer $FILE
amixer set CD unmute
exit
fi
if [ "$3" = "-p" ]; then
if [ ! $4 ]; then
echo "ERROR: Start time missing"
exit
fi
echo "Planned recording on channel ${1} at ${4} for ${2} seconds"
echo amixer set CD mute | at ${4}
echo $MENCODER tv:// $TV $VIDEO $AUDIO -endpos ${2} -ffourcc divx -o $FILE | at ${4}
exit
fi
if [ !$3 ]; then
echo "Instant recording on channel ${1} for ${2} seconds"
amixer set CD mute
$MENCODER tv:// $TV $VIDEO $AUDIO -endpos ${2} -ffourcc divx -o $FILE
amixer set CD unmute
exit
fi
Per poterlo usare vi basta copiarlo e incollarlo in file di testo e salvarlo come “recorder.sh”. Naturalmente ricordatevi dove lo salvate per poi poterlo eseguire!
Le impostazioni per la compressione dell’audio sono dentro alla variabile “AUDIO” mentre quelle per il video nella variabile “VIDEO”. Poi c’è il “DSP” (che dicevamo è la periferica audio) e “TV” che è la scheda da cui acquisire. Qualunque modifica allo script andrebbe fatta dunque in queste 4 variabili.
Come dicevo all’inizio, per finire, lo script può registrare istantaneamente oppure, se è stato specificato un’orario, mettere in coda l’azione usando il comando AT. Se viene impostata un’azione futura, è sempre possibile controllare che l’azione sia stata correttamente messa in coda da AT digitando:
$ atq
Ci sono alcune piccole cose che ho intenzione di modificare in questo script, come ad esempio la possibilità di scrivere la durata del programma in minuti o ore (adesso accetta solo secondi, quindi 1 ora è 3600 secondi) e la possibilità di fargli aprire direttamente il player per seguire la registrazione. Un’altra funzione utile potrebbe essere quella di fargli mettere in “mute” il canale del CD IN della scheda audio. Infatti adesso tutte le volte che verrà avviato mencoder partirà anche l’audio proveniente dalla TV.
Con l’aggiornamento alla versione 1.1 ho aggiunto due funzioni: la prima (-f) che apre automaticamente gmplayer sul file che si sta salvando; la seconda (attraverso amixer) che mette in muto il canale CD della scheda audio. In questo modo non si sente la tv mentre la si registra!
Quindi un uso tipico, in perfetto stile timeshifting è:
./recorder.sh 25 3600 -f
In questo modo recorder.sh farà partire la registrazione sul canale 25 per una durata massima di 1 ora e provvederà ad aprire mplayer e selezionare il file che si sta creando. Ora potete mettere in pausa la registrazione e riprenderla liberamente mentre lo script continua a registrare.
Se viene programmata una registrazione, ad esempio di notte, ricordatevi sempre di spegnere le casse del PC altrimenti potrebbe venirvi un infarto quando parte l’audio a tutto volume!
Conclusioni
Nel caso abbiate proposte di modifica o suggerimenti per farlo funzionare meglio, siate liberi di lasciare dei commenti!
Ah, l’ispirazione di questo script mi è stata data da questo ottimo post: link.
[post originale: 28 agosto 2008 - aggiornato il 10 ottobre 2008]

settembre 15th, 2008 at 10:55
Ottimo, anch’io ho fatto una cosa simile.
Chiedevo: come faccio a vedere ciò che sto registrando? Redirigere il file in creazione su vlc o mplayer… o altro
settembre 15th, 2008 at 14:39
Io di solito apro direttamente il file da totem appena inizia a crearlo. Comunque si potrebbe mettere una stringa in fondo allo script che lancia vlc o mplayer e gli si indica il file che sta creando.
settembre 15th, 2008 at 18:32
…appunto, io ho aggiunto
| vlc nomedelfile, ma mi dice che non lo trova
settembre 15th, 2008 at 18:42
Ah.. appena torno a casa provo a guardarci. Comunque così su due piedi mi sa che ci devi mettere un piccolo ritardo in mezzo. Magari prova con “sleep 5″ prima di lanciare vlc, così sei sicuro che il file sia già stato creato e che mencoder ci abbia messo gli headers.
settembre 17th, 2008 at 17:01
ho provato con sleep 5, ma va in blocco pulse audio e vlc (e anche ffplay o mplayer) mi fa vedere solo i secondi registrati fino a quel momento…
ottobre 4th, 2008 at 14:35
Massimiliano ho modificato il post aggiornando lo script. Come puoi vedere adesso provvede automaticamente ad aprirti il file proprio come volevi tu. Basta che metti “-f”. Scusa se ci ho messo un po’ ma ho avuto tempo di mettermi al lavoro sullo script solo oggi!
ottobre 5th, 2008 at 18:19
Bel lavoro, davvero!
…però mplayer non parte… e neanche totem… e altri…
ottobre 5th, 2008 at 19:34
Hai ragione… c’era un piccolo errore. Ora dovrebbe (!) funzionare.
ottobre 5th, 2008 at 21:05
…purtroppo no…
mi da un errore pulse audio che non conosco e si ferma
ottobre 5th, 2008 at 22:11
Beh no, aspetta. Questo non è un errore dello script, riguarda la tua installazione/disto. Devi provare a eseguire i comandi manualmente per vedere che non ci sia qualche impostazione da cambiare. Potrebbe essere mencoder, gmplayer, la scheda tv o quella audio….
ottobre 7th, 2008 at 13:42
non riesco… uso xubuntu 8.04.1