== Configurazione di una scheda TV su Etch == Questi sono appunti sulla configurazione di una scheda TV Pinncale 310i (chip saa7133, drivers per saa7134) che supporta sia analogico che digitale terrestre. Questi appunti possono essere adattati anche ad altre schede supportate. Per ulteriori informazioni visita il sito http://www.linuxtv.org/. === Installazione dei drivers nel kernel === Siccome Etch usa un kernel 2.6.18, che e` troppo vecchio per la mia scheda, ho dovuto installare i drivers dal sito di linuxtv. * Installare il sorgente del kernel (Debian) * Configurare e installare il kernel, compilando il supporto per la TV sotto multimedia devices, abilitando sia l'analogico che il DVB. Qui possiamo scegliere quali drivers installare per quali chipset, ma in realta` dovremo ricompilare i moduli dai sorgenti delle versioni piu` nuove. E` bene che tutto sia compilato come moduli quando possibile. Non dimenticate il supporto ALSA che useremo per registrare l'audio dalla scheda TV. * Installare il sorgente dei drivers da linuxtv.org come segue: * posizionarsi in /usr/src (o dove volete voi!) * installare, se non lo si ha, Mercurial tramite apt-get {{{ apt-get install mercurial }}} * Scaricare con Mercurial i sorgenti dei moduli TV: {{{ hg clone http://linuxtv.org/hg/v4l-dvb }}} * Entrare nella directory v4l-dvb appena creata da Mercurial * Eseguire {{{make menuconfig}}} per scegliere quali moduli compilare, oppure lasciare che si compili tutto e buonanotte * Eseguire {{{make}}} per compilare tutti i moduli e poi {{{make install}}} per installare i moduli * Scaricare il firmware per la scheda (la Pinnacle 310i ne ha bisogno, altre non saprei) * Posizionarsi in /lib/firmware * Eseguire {{{ perl /usr/src/v4l-dvb/linux/Documentation/dvb/get_dvb_firmware tda10046 }}} * Se il chip sulla vostra scheda e` il tda10045 (dipende dalle versioni della scheda) eseguite il comando qui sopra mettendo "10045" al posto di "10046". * Provate a caricare i moduli e vedete se la scheda viene riconosciuta. Per farlo e` bene che nessun modulo del sistema video4linux sia caricato, quindi o si fa un reboot, oppure si puo` andare in {{{usr/src/v4l-dvb}}} ed eseguire {{{make reload}}}, comando che scarica e ricarica tutti i moduli del sistema video4linux. Se la scheda viene riconosciuta, dovreste vedere in dmesg qualcosa come: {{{ Linux video capture interface: v2.00 saa7130/34: v4l2 driver version 0.2.14 loaded GSI 22 sharing vector 0x42 and IRQ 22 ACPI: PCI Interrupt 0000:05:00.0[A] -> GSI 21 (level, low) -> IRQ 66 saa7133[0]: found at 0000:05:00.0, rev: 209, irq: 66, latency: 32, mmio: 0x88050000 saa7133[0]: subsystem: 11bd:002f, board: Pinnacle PCTV 310i [card=101,autodetected] saa7133[0]: board init: gpio is 600e000 input: Pinnacle PCTV as /class/input/input3 ir-kbd-i2c: Pinnacle PCTV detected at i2c-1/1-0047/ir0 [saa7133[0]] saa7133[0]: i2c eeprom 00: bd 11 2f 00 54 20 1c 00 43 43 a9 1c 55 d2 b2 92 saa7133[0]: i2c eeprom 10: ff e0 60 06 ff 20 ff ff 00 30 8d 2f 8a 0e ff ff saa7133[0]: i2c eeprom 20: 01 2c 01 23 23 01 04 30 98 ff 00 e7 ff 21 00 c2 saa7133[0]: i2c eeprom 30: 96 10 03 32 15 20 ff 15 0e 6c a3 eb 04 38 5c fe saa7133[0]: i2c eeprom 40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff saa7133[0]: i2c eeprom 50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff saa7133[0]: i2c eeprom 60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff saa7133[0]: i2c eeprom 70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff tuner 1-004b: chip found @ 0x96 (saa7133[0]) tuner 1-004b: setting tuner address to 61 tuner 1-004b: type set to tda8290+75a saa7133[0]: registered device video0 [v4l2] saa7133[0]: registered device vbi0 saa7133[0]: registered device radio0 DVB: registering new adapter (saa7133[0]). DVB: registering frontend 0 (Philips TDA10046H DVB-T)... tda1004x: setting up plls for 48MHz sampling clock tda1004x: found firmware revision 0 -- invalid tda1004x: trying to boot from eeprom tda1004x: timeout waiting for DSP ready tda1004x: found firmware revision 0 -- invalid tda1004x: waiting for firmware upload... tda1004x: found firmware revision 20 -- ok saa7134 ALSA driver for DMA sound loaded saa7133[0]/alsa: saa7133[0] at 0x88050000 irq 66 registered as card -1 tda1004x: setting up plls for 48MHz sampling clock tda1004x: found firmware revision 20 -- ok tda1004x: setting up plls for 48MHz sampling clock tda1004x: found firmware revision 20 -- ok tda1004x: setting up plls for 48MHz sampling clock tda1004x: found firmware revision 20 -- ok }}} Se tutto e` a posto, potete aggiungere a /etc/modules il modulo {{{saa7134-alsa}}}. I moduli che vengono autocaricati dovrebbero essere saa7134 e saa7134-dvb, oltre a tutti i moduli di contorno di video4linux. === Installazione di mplayer e mencoder === Per fare le mie prove (e per registrare la TV analogica) ho usato mplayer e mencoder. Avrei potuto usare tvtime, xawtv o altri programmi, ma la mia VGA non supporta il video overlay, quindi mplayer e` l'unico player che funziona (male, tra l'altro). Siccome il mio scopo e` registrare, poco importa. Ho installato mplayer e mencoder dal repository unofficial di linuxmultimedia. Per farlo, basta aggiungere al file {{{/etc/apt/sources.list}}} una riga che dice: {{{ # mencoder e mplayer deb http://www.debian-multimedia.org etch main }}} Poi eseguire: {{{ apt-get update apt-get install debian-multimedia-keyring (Accettare il download non digitally signed!) apt-get update apt-get install mencoder mplayer }}} === Installazione di alcune utility utili === Per vedere se ricevete qualche canale TV, potete installare "scantv", sempre con apt-get. Per vedere se ricevete qualche canale digitale, vi serve invece il pacchetto "dvb-utils" (sempre apt-get). === Configurazione dei permessi === Se volete operare (registrare, fare scansione canali, vedere la TV) come utente normale e non come root, dovete assicurarvi che l'utente che volete usare sia nei gruppi "video" e "audio". Io ho sempre operato come utente se non per installare il kernel e i drivers e i pacchetti usati. === Scansione canali TV === Da questo momento ho eseguito tutte le operazioni come utente e non come root, Attaccate l'antenna, e tentate una scansione dei canali TV, cosi`: {{{ scantv -C /dev/vbi0 }}} Rispondete alle domande sullo standard (0-PAL) e sul paese (7-italy) e vedete se trovate qualche canale. Potete anche ridirigere l'output su un file di testo, che sara` utile in seguito. === Scansione canali TV DVB === Se si vede qualcosa in analogico, vediamo cosa si vede in digitale. (il file it-Bologna) lo potete sostituire con quello della vostra citta`. Se non c'e` un file per la vostra citta`, occorre crearlo scoprendo su quali frequenze sono i MUX nella vostra citta`. O usate il file standard di Debian come indicato, oppure potete cercare su internet l'elenco dei MUX della vostra citta`. {{{ scan /usr/share/doc/dvb-utils/examples/scan/dvb-t/it-Bologna }}} Se nell'output si vedono nomi di canali, molto bene, potete salvare anche questo output su un file di testo. Consiglio di salvarlo nella propria home con il nome {{{.tzap/channels.conf}}} Qui di seguito c'e` un file per Bologna (da usare al posto di /usr/share/doc/dvb-utils/examples/scan/dvb-t/it-Bologna) aggiornato da me. Contiene quattro MUX in piu` rispetto a quello di Debian. {{{ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy #RaiA T 203500000 7MHz 2/3 2/3 QAM64 8k 1/32 NONE #Sestarete / Rete 7 T 212500000 7MHz 2/3 2/3 QAM64 8k 1/32 NONE #Modena T 219500000 7MHz 2/3 2/3 QAM64 8k 1/32 NONE #Allmusic T 594000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE #Sestarete / Rete 7 T 610000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE #DFree T 634000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE #Mediaset Mux-B T 698000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE #La7 T 714000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE #RaiB T 722000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE #Mediaset Mux-A T 794000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE # Dfree T 770000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE # Telesanterno T 802000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE # Rete7 T 682000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE }}} {{{ cd ~ mkdir .tzap scan /usr/share/doc/dvb-utils/examples/scan/dvb-t/it-Bologna > .tzap/channels.conf }}} === Vedere la TV analogica === Per vedere la TV analogica, una cosa cosi` dovrebbe funzionare con qualsiasi scheda video (sotto X, non in testo!) {{{ mplayer tv:// -tv driver=v4l2:chanlist=europe-west:normid=0:channel=28:input=0 -vo x11 }}} Mettete come "channel" un canale che trasmette qualcosa. Se manca l'audio, occorre collegare l'output della scheda TV (interno) all'input della scheda audio e poi alzare il canale giusto nel mixer. === Vedere la TV digitale === Per vedere la TV digitale io ho provato Xine ({{{apt-get install gxine}}} se avete gnome) che funziona ma a causa della la mia maledetta VGA devo lanciare {{{xine -V XSHm}}} che e` pateticamente lento nell'update del video. Probabilmente voi sarete piu` fortunati! Per configurarlo basta creare dentro a {{{~/.xine/}}} il file {{{channels.conf}}} usando {{{scan}}} come indicato prima, poi lanciare gxine, poi dal menu` "File" scegliere "DVB" e scegliere il canale con i tasti avanti e indietro. Un altro metodo e` usare il meraviglioso mplayer, che mi stupisce perche` e` in grado di vedere TUTTO. Dopo aver copiato il file "channels.conf" dentro a {{{~/.mplayer}}} e` sufficiente lanciare: {{{ mplayer dvb://"Canale 5" -tv driver=v4l2 -vo x11 -ao sdl }}} per vedere Canale 5. (se e` nel vostro file dei canali, ovviamente) I parametri "-ao sdl" e "-vo x11" si riferiscono ai metodi di output dell'audio (oss in questo caso) e del video (x11 in questo caso) a causa della mia solita maledetta VGA. === Registrare la TV digitale === Per registrare la TV digitale si puo` usare dvbstream, che consente anche di mandarla in stream a un altro (o piu` di un altro) pc sulla rete. Dvbstream non e` comodo come mplayer (o mencoder) che riescono a leggere il file di configurazione dei canali prodotto da {{{scan}}}. Qui occorre inserire i valori presi dal file a mano. Per esempio, se apriamo il file {{{channels.conf}}} prodotto da {{{scan}}}, possiamo cercare Canale 5. Lo trovo (qui a Bologna) in una riga che dice: {{{ Canale 5:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:512:650:21 }}} Per registrare Canale 5 con Dvbstream su un file, scrivero`: {{{ dvbstream -f 698000000 -tm 8 -ps -n 10 512 650 -o > test.mpeg }}} I parametri sono: * -f frequenza (secondo campo del file channels.conf) * -tm 8 (transimission mode, se non lo metti in Italia non funziona) * -ps (produci in output un file di tipo PS anziche` TS, qui dipende dal player che poi vorrai usare per vederlo) * -n 10 (registra per 10 secondi e poi esci. Qui ovviamente metti il tempo che vuoi) * 512 (pid dello stream video, terzultimo campo del file channels.conf) * 650 (pid dello stream audio, penultimo campo del file channels.conf) * -o (output su stdout anziche` streaming su rete IP) Per vedere se il file registrato contiene qualcosa, si puo` rivedere al volo con {{{ mplayer test.mprg -vo x11 }}} Il vantaggio di usare dvbstream e` che ottieni una copia esatta senza transcoding dello stream entrante, quindi non c'e` alcuna perdita di qualita` rispetto alla visione in diretta. Lo svantaggio e` che la compressione e` mpeg2, e non divx o altro, quindi consuma veramente un casino di spazio su disco (15 Mbit/sec per il video e 384 Kbit/sec per l'audio). Un minuto di registrazione prende 40 mega (2,4 Gbytes/ora). Alternativamente, e` possibile usare mencoder, come per la TV analogica. Qualcosa tipo: {{{ mencoder -ffourcc "divx" dvb://"Canale 5" -tv driver=v4l2:buffersize=256 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2500 -vf pp=lb/h1:a/v1:a -oac mp3lame -o test2.avi }}} Poi, come per l'esempio che segue della TV analogica, si puo` fare lo splitting del file avi. E` anche possibile usare dvbstream e poi ricodificare con mencoder, questo e` un esempio buttato li`, che comprime video e audio, e fa anche filtraggio per deinterlacciare: {{{ mencoder -ffourcc "divx" test.mpeg -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2500 -vf pp=lb/h1:a/v1:a -oac mp3lame -o test3.avi }}} === Registrare la TV analogica === Per registrare la TV analogica, uso mencoder. Le opzioni sono cosi` tante che c'e` da impazzire. Comunque in linea di massima questa e` l'impostazione che sto provando per registrare in un formato che puo` essere letto dal Kiss. {{{ #!/bin/bash # Tvrecord, uno scriptino semplice per registrare dalla TV usando mencoder. # Questo script, lanciato da Cron o in console, registra un dato canale per tot tempo # e salva un file con un nome composto da un parametro dato in ingresso e data e ora di inizio # della registrazione. # I parametri sono: # Nome del file # canale TV # Durata della registrazione in formato HH:MM NOME=$1 CANALE=$2 DURATA=$3 DATA=`date +%F` if [[ $# != 3 ]] then echo "Numero errato di parametri"; echo "Uso: tvrecord " else echo $NOME, $CANALE, $DURATA, $DATA; # Registrazione echo . echo Registrazione echo . # questo funziona, e` in sincro, usa l'audio della Pinnacle, va in stereo. # pero` consuma un pacco di banda per l'audio. # mencoder -endpos $DURATA:00 -ffourcc "divx" -audio-density 25 tv:// -tv driver=v4l2:channel=$CANALE:chanlist=eu rope-west:normid=0:input=0:width=720:height=576:device=/dev/video0:buffersize=256:fps=25:alsa:adevice=hw.1,0:audiorate=3 2000:amode=1 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2500 -vf pp=lb/h1:a/v1:a -oac pcm -o /ud2/video/$NOME$DATA.temp .avi # proviamo a ridurre la banda dell'audio mencoder -endpos $DURATA:00 -ffourcc "divx" -audio-density 25 tv:// -tv driver=v4l2:channel=$CANALE:chanlist=eu rope-west:normid=0:input=0:width=720:height=576:device=/dev/video0:buffersize=256:fps=25:alsa:adevice=hw.1,0:audiorate=3 2000:amode=1 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2500 -vf pp=lb/h1:a/v1:a -oac mp3lame -o /ud2/video/$NOME$DATA.te mp.avi # Transcoding, splitting echo . echo Transcoding and splitting echo . # transcode -i /ud2/video/$NOME$DATA.temp.avi -P1 -q0 -y raw -o /ud2/video/$NOME$DATA.avi && \ avisplit -s 1000 -i /ud2/video/$NOME$DATA.temp.avi -o /ud2/video/$NOME$DATA 2> /dev/null && \ ls /ud2/video/$NOME$DATA.temp.avi && echo Successo fi }}}