Table of Contents
Appunti Elaborazione Video
Riferimenti web
- Video4linux Wiki http://linuxtv.org/v4lwiki/index.php/Main_Page
Software
Molti pacchetti relativi all'elaborazione video non sono presenti nella distribuzione Debian ufficiale a causa di potenziali problemi legati ai brevetti software. Per fortuna ottimi pacchetti Debian preparati da Christian Marillat si trovano presso il repository www.debian-multimedia.org.
Video Format
Questi sono i formati video piu' utilizzati:
4:3 | 1.33333:1 |
16:9 | 1.77778:1 |
1.85:1 | |
2.20:1 | |
2.35:1 |
Le larghezze 720 e 704 derivano dalla frequenza di campionamento di linea (con un po' di overscan) pari a 13.5 MHz (si tratta di uno standard industriale). Per il PAL a 576 linee questo si traduce in un pixel rettangolare. Per avere un pixel quadrato si usa il campionamento a 14.75 MHz, che - arrotondando un po' - produce 768 pixel in larghezza. Quindi i formati video in pixel più utilizzati sono:
Resolution | Note |
---|---|
720 × 576 | Rectangular pixel |
704 × 576 | Rectangular pixel |
768 x 576 | PAL resolution with square pixel |
In generale un film adatto al formato 16:9 ha i pixel rettangolari e deve essere ridimensionato per il formato 4:3 dividendo l'altezza per (4/3).
Scheda di acquisizione Pinnacle PCTV Pro
La scheda Pinnacle PCTV Pro ha un chip per la cattuara video Brooktree Corporation Bt878, per la sintonia TV un sintonizzatore MT2032 compatibile, un chip TDA9887 per la demodulazione video PAL, SECAM e NTSC e dell'audio AM e FM e infine un chip audio stereo msp3400. I moduli kernel necessari (e le opzioni) sono:
- bttv card=52 (force card type because autodetect finds a Pinnacle PCTV [card=39])
- tuner
- tda9887 (starting from kernel 2.6.18 you only need the tuner module)
- tvaudio
- msp3400
La seguente tabella elenca i device che risultano disponibili dopo aver caricato i moduli. Lo standard è definito dalle API di Video4linux v.2 (v4l2).
Device Name | Major | Minor | Function |
---|---|---|---|
/dev/video0 | 81 | 0-63 | Video Capture Interface |
/dev/radio0 | 81 | 64-127 | AM/FM Radio Devices |
/dev/vtx0 | 81 | 192-223 | Teletext Interface Chips |
/dev/vbi0 | 81 | 224-239 | Raw Vertical Blank Interval Data (Intercast/teletext) |
Per l'audio si deve collegare l'uscita audio della PCTV con l'ingresso line-in della scheda audio. Per l'uscita audio sulla PCTV esiste un connettore esterno ed uno interno. In questa configurazione l'audio viene acquisito dalla scheda audio? Forse è questo il motivo della deriva del sincronismo audio/video dopo molti minuti di registrazione? Come si specifica il device di acquisizione audio con i vari programmi di registrazione?
Pare tuttavia che si possa acquisire l'audio direttamente dal chip BTT, con il modulo bttaudio che fa parte dei driver sound OSS. Ci sono alcune istruzioni per usare il modulo. Quando lo si carica vengono resi disponibili nuovi dispositivi:
btaudio: driver version 0.7 loaded [digital+analog] ACPI: PCI Interrupt 0000:00:09.1[A] -> GSI 17 (level, low) -> IRQ 201 btaudio: Bt878 (rev 17) at 00:09.1, irq: 201, latency: 32, mmio: 0xe3000000 btaudio: using card config "default" btaudio: registered device dsp2 [digital] btaudio: registered device dsp3 [analog] btaudio: registered device mixer2
In particolare abbiamo un input digitale (/dev/dsp2
), che dovrebbe essere stereo a 16 bit e 32 kHz, e un input analogico (/dev/dsp3
) che dovrebbe essere mono. Infine il mixer dovrebbe servire a miscelare gli input analogici, che potrebbero essere più di uno. Essendo un mixer OSS (non ALSA) si deve usare un programma adatto, ad esempio aumix -d /dev/mixer2
.
Noi abbiamo provato senza successo:
sox -c 2 -w -r 32000 -t ossdsp /dev/dsp3 digital.wav sox -c 1 -w -r 32000 -t ossdsp /dev/dsp3 analog.wav
nel primo caso si ottiene un file vuoto, nel secondo un file assolutamente non modulato. La cosa strana è che non si riesce ad impostare il volume del canale con aumix
; rimane a zero.
Visualizzazione TV
Tvtime
Pare il programma migliore per la visualizzazione TV sotto X-Window, forse perché effettua il de-interlace al volo. L'elenco dei canali sintonizzati viene scritto in $HOME/.tvtime/stationlist.xml
e viene sovrascritto ogni volta all'uscita del programma, quindi non esiste una versione system-wide di tale file.
Xawtv
Programma “storico” per la visualizzazione TV sotto X-Window. Installato il pacchetto xawtv
e le sue dipendenze. Altri pacchetti utili sono: motv
, streamer
, tv-fonts
, xawtv-plugin-qt
, xawtv-tools
.
Il programma xawtv è un player per schede TV, con la possibilità di memorizzare i nomi dei canali presenti sulle varie frequenze (/etc/X11/xawtvrc
) e la possibilità di salvare snapshot o filmati non compressi.
Se i menu di xawtv hanno un font di scarsa qualità, controllare che sia installato il pacchetto tv-fonts
e che il font ledfixed-medium
risulti disponibile al server X (usare xlsfonts
). Il font si trova nel file led-iso8859-15.pcf.gz
nella directory /usr/lib/X11/fonts/misc
. E' importante anche aver impostato il locale giusto, ad esempio it_IT@ISO-8859-15
.
La configurazione di sistema per xawtv si trova in /etc/X11/xawtvrc
, oltre ai nomi dei canali ci sono altre opzioni utili, come il capture che influisce sul modo di andare in fullscreen:
[global] freqtab = italy [defaults] input = Television norm = PAL capture = grabdisplay [RAI 1] channel = F [Europa 7 Teleregione] channel = 24 [RAI 2] channel = 29
Quale risoluzione e quale programma di acquisizione
La parte utile del segnale PAL (corrisponde ad una delle risoluzioni supportate dalla scheda PCTV) è 768 x 576.
mencoder
Pare avere un'ottimo algoritmo di compressione in tempo reale, forse perché esiste compilato e ottimizzato per ciascuna architettura.
Ci potrebbe essere un conflitto con il demone audio di KDE - artsd - che impedisce a mencoder di aprire il device audio:
ALSA lib pcm_dsnoop.c:606:(snd_pcm_dsnoop_open) unable to open slave Error opening audio: Invalid argument v4l2: 0 frames successfully processed, 0 frames dropped. Segmentation fault
si può eseguire un killall artsd
, ma KDE lo riavvia appena se ne accorge. In alternativa lo si disattiva dal pannello di controllo KDE.
#!/bin/sh OUT_FILE=~/capture_$(date +%Y-%m-%d_%H:%M:%S).avi # Input source: # 0 TV # 2 Composite INPUT=0 # TV Channel, relative to chanlist (see ~/.tvtime/stationlist.xml). # F = Rai1 # 29 = Rai2 # 50 = Rai3 # ... TV_CHANNEL='50' # Recording time (HH:MM:SS). REC_TIME=00:01:00 # Video bitrate, 9000 makes 70Mb per minute, 4Gb per hour. BITRATE=9000 # ALSA sound: activate capture on Line input. amixer -q sset Line cap # ALSA sound: set overall input gain and capture. amixer -q sset Capture 87% cap # Capture audio from OSS device (e.g. mono, 32 kHz). #AUDIO=adevice=/dev/dsp3:amode=0:audiorate=32000 # Capture audio from ALSA device (e.g. stereo, 44.1 kHz). AUDIO=alsa:adevice=hw.0:audioid=0:amode=1:audiorate=44100 # Start A/V recording... mencoder tv://$TV_CHANNEL \ -tv driver=v4l2:width=768:height=576:fps=25:input=${INPUT}:chanlist=italy:${AUDIO} \ -endpos ${REC_TIME} \ -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=${BITRATE} \ -oac pcm -noskip \ -o "$OUT_FILE"
Il video
Il video viene salvato nel formato mpeg4 di FFmpeg, questa codifica è identificata dalla sigla FOURCC (Four Character Code) FMP4.
L'audio
La scheda di acquisizione TV fornisce l'audio dall'apposita presa jack che deve essere collegata alla presa Line della scheda audio. Quindi in definitiva è la scheda audio che effettua l'acquisizione. E' necessario settare opportunamente i livelli del Mixer, in generale sono tre i parametri che influiscono: l'opzione capture, il guadagno in ingresso e il livello del canale Line.
Con l'opzione capture si stabilisce quali input della scheda audio entreranno nella registrazione. Attivando il capture del canale Line in generale si esclude il capture delle altre sorgenti (CD, microfono, …).
Il guadagno in ingresso, etichettato Capture in Kmix ed Alsamixer, IGain in Aumix. Anzitutto si deve attivare il capture anche su questo controllo che funziona come livello master della registrazione, altrimenti tutta la registrazione risulterebbe muta. Impostare il guadagno ad un livello maggiore di zero per amplificare opportunamente il segnale. Fare attenzione che in Aumix e Alsamixergui non è visibile l'opzione capture per questo controllo, basta impostare il guadagno ad un valore maggiore di zero per attivarla.
In generale il volume di riproduzione (impostato con i normali controlli del mixer) non influsce sul volume di registrazione, anzi la maggior parte delle schede audio non consente di variare il volume della linea in ingresso, ma solo di attivarla o disattivarla (opzione capture vista sopra). Con il programma Alsamixer si vede chiaramente questa situazione: premendo il tasto F4 vengono mostrati solo i controlli per la registrazione e il caname Line ha solo l'opzione Capture on/off, senza possibilità di regolarne il livello.
Mixer | Capture del canale Line | Capture generale e Guadagno in ingresso |
---|---|---|
Kmix | Scheda Input, spia rossa sotto il cursore Line | Scheda Input, spia rossa sotto il controllo Capture e impostare il livello. |
Alsamixer | F4 per i controlli in Input, spazio per abilitare Line | F4, spazio per abilitare Capture e impostare il livello desiderato. |
streamer
Il programma salva in formato non compresso oppure in MJPEG, comunque poca compressione e quindi si perdono frame perché il disco non riesce a star dietro al flusso di dati.
streamer -t 00:00:10 -s 768x576 -r 25 -f mjpeg -F stereo -o prova.avi
La codifica Motion JPEG è identificata dalla sigla FOURCC (Four Character Code) MJPG.
ffmpeg
Anche in questo caso la compressione in tempo reale sembra non produrre risultati soddisfacenti.
ffmpeg -t 00:00:10 -s 768x576 -r 25 -vd /dev/video0 -b 8192 -vcodec xvid -acodec copy -ac 2 -ar 44100 prova.avi
Deriva del sincronismo Audio/Video (drift)
Purtroppo con la scheda PCTV l'acquisizione dell'audio viene fatta dalla scheda audio del computer, e non dalla PCTV stessa. Questo significa che il quarzo che pilota le due acquisizioni non è lo stesso. Da una parte abbiamo il quarzo della PCTV che genera le frequenze per l'acquisizione a 25 fps, dall'altra abbiamo il quarzo della scheda audio che genera le frequenze per l'acquisizione a 44100 Hz. Sicuramente i due quarzi avranno una (piccola) differenza di sincronia e questo porta inevitabilmente a problemi di sincronizzazione audio/video nelle registrazioni.
Il programma mencoder può trovarsi a ricevere più materiale audio rispetto al video (o viceversa), non sapendo di questa (leggera) deriva accoppierà i due flussi producendo un filmato che con il passare dei minuti perderà progressivamente sincronismo. Nel mio personalissimo caso ho misurato una perdita di sincronismo dell'ordine di 1 su 5274, cioè dopo 5274 secondi di registrazione l'audio era in ritardo rispetto al video di un secondo. Con mplayer
era richiesto un aggiustamento positivo dell'A-V delay (tasto +
).
Una soluzione potrebbe essere quella di processare l'audio togliendo un campione audio ogni 5274, in gergo tecnico di parla di decimazione dei campioni. Il software Audacity pare che non abbia questa funzione, in alternativa si aumenta la velocità (Effect, Change Speed) di una percentuale pari a 1 / 5274 = 0.0190%.
Copia o rip da DVD
Anzitutto si deve identificare quale traccia video interessa, lsdvd
(dall'omonimo pacchetto Debian) dovrebbe indicare chiaramente qual'è la traccia audio/video principale, quali sono i trailer e i contenuti extra:
# lsdvd libdvdread: Using libdvdcss version 1.2.9 for DVD access Disc Title: PRENDI_I_SOLDI_E_SCAPPA Title: 01, Length: 01:21:27.060 Chapters: 12, Cells: 12, Audio streams: 03, Subpictures: 01 Title: 02, Length: 00:00:30.000 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 00 Title: 03, Length: 00:00:17.040 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 00 Title: 04, Length: 00:06:12.240 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 00 Title: 05, Length: 00:00:44.000 Chapters: 02, Cells: 02, Audio streams: 00, Subpictures: 00 Longest track: 01
Anche il programma dvdbackup
(omonimo pacchetto Debian) visualizza molte informazioni sul DVD:
# dvdbackup -i /dev/dvd -I libdvdread: Using libdvdcss version 1.2.9 for DVD access libdvdread: Attempting to retrieve all CSS keys ... DVD-Video information of the DVD with title PRENDI_I_SOLDI_E_SCAPPA File Structure DVD VIDEO_TS/ VIDEO_TS.IFO 14336 VIDEO_TS.VOB 114688 VIDEO_TS.BUP 14336 VTS_01_0.IFO 61440 VTS_01_0.VOB 311296 ... Main feature: Title set containing the main feature is 1 The aspect ratio of the main feature is 16:9 The main feature has 1 angle(s) The main feature has 1 audio_track(s) The main feature has 1 subpicture channel(s) The main feature has a maximum of 12 chapter(s) in on of its titles The main feature has a maximum of 6 audio channel(s) in on of its titles ...
dvdbackup può copiare su disco fisso le singole feature del DVD in modo selettivo, oppure fare un backup completo di tutto il disco:
dvdbackup -i /dev/dvd -o /path/to/backup/ -M
Si potrebbe copiare il contenuto di un DVD-Video anche copiando con i normali comandi Unix tutti i file in esso contenuti (lo si deve montare come filesystem UDF invece che iso9660, in modo da vedere i file con i nomi in maiuscolo). Tuttavia se il DVD ha il sistema di protezione CSS o il codice di regione diverso dal drive (vedere RPC mode 2 protection) la lettura dei file genera un errore:
# cp -p VTS_02_0.VOB /path/to/backup/ cp: reading `VTS_02_0.VOB': Input/output error
Ecco il motivo per cui la libreria libdvdread3
(usata dal programma dvdbackup
e altri) suggerisce di installare libdvdcss
, altrimenti i DVD protetti sono illeggibili. La copia fatta con dvdbackup
è priva della protezione CSS e del codice di regione, mentre la copia effettuata con il cp
, se funziona, mantiene la protezione inalterata. E' vero?? Verificare!!
La copia del DVD deve essere anch'essa in formato UDF, se si facesse un'immagine iso9660 (quindi un DVD-ROM invece che un DVD-Video), alcuni player ed alcune utility come lsdvd
non riconoscerebbero il disco come DVD-Video. Pertanto la sintassi di mkisofs
da usare è:
mkisofs -dvd-video -V DVD_TITLE -o ISONAME.iso /PATH/TO/BACKUP/
Per effettuare il rip di una traccia video:
mplayer dvd://1 -dumpstream mplayer -dvd-device /dir/DVD_TITLE dvd://3 -dumpstream mplayer dir/DVD_TITLE/VIDEO_TS/VTS_03_1.VOB -dumpstream ogle ???
Nel primo caso si esegue il rip da un DVD non montato. Il numero 1 nell'esempio indica la traccia audio/video. Il formato dumpstream
è la traccia audio/video raw compressa, apribile con Avidemux per ulteriori elaborazioni.
Nel secondo esempio si rippa l'intera traccia 3 dai file originali contenuti nel DVD (magari copiati sul disco fisso con dvdbackup
).
Nel terzo esempio invece si rippa uno solo dei file VOB; non molto utile in quanto una traccia DVD di solito viene spezzettata in diversi file VOB che non superano la dimensione di 1Gb l'uno.
Anche il programma ogle è in grado di leggere i DVD ed effettuare il rip, ma non l'ho provato.
Copia da Video CD (VCD)
Per vedere il contenuto di un Video CD si può utilizzare mplayer
:
mplayer -cdrom-device /dev/sr0 vcd://1
Probabilmente a causa di meccanismo di protezione potrebbero verificarsi errori di lettura, evidenziati dal kernel in questo modo:
sr 1:0:0:0: [sr0] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE sr 1:0:0:0: [sr0] Sense Key : Illegal Request [current] sr 1:0:0:0: [sr0] Add. Sense: Illegal mode for this track sr 1:0:0:0: [sr0] CDB: Read(10): 28 00 00 01 83 c0 00 00 02 00 end_request: I/O error, dev sr0, sector 397056 Buffer I/O error on device sr0, logical block 49632 ... sr0: CDROM (ioctl) error, command: Volume set (in), Read cd be 00 00 01 1d 68 00 00 01 f8 00 00 sr: Sense Key : Medium Error [current] ... sr: Add. Sense: L-EC uncorrectable error
Un tentativo fa fare è quello di leggere direttamente la traccia #2. Ecco come fare e contestualmente salvare il video in un file:
mplayer -cdrom-device /dev/sr0 vcd://2 -dumpstream -dumpfile video_cd_track2.dump
Acquisizione video digitale
Per acquisire video digitale da una telecamera e salvarlo in formato MPEG2:
- Collegare la telecamera alla presa ieee1394
- Controllare di aver caricato il modulo kernel ieee1394, l'hardware viene riconosciuto con un messaggio del genere:
ieee1394: Host added: ID:BUS[0-00:1023] GUID[0000010000001b94]
- Controllare di avere accesso in lettura e scrittura al device
/dev/raw1394
- Lanciare il programma Kino, verificare dal menu Edit, Preferences, IEEE 1394 che le impostazioni siano corrette.
- Selezionare la funzione Capture dal menu a destra. Vengono creati diversi file del tpio capture001.dv, uno per ogni scena filmata.
- Selezionare la funziona Export, scegliere il formato MPEG con le opportune opzioni e salvare.
Sottotitoli
Sebbene i sottotitoli siano semplici file di testo, ne esistono molti formati diversi. Il formato SubRip sembra supportato da Mplayer e da XBMC e supporta la codifica UTF-8. In generale i player moderni sono in grado di trovare automaticamente i sottotitoli se il file viene salvato nella stessa cartella del video con un nome uguale, ma estensione .sub.
Per creare il file si può utilizzare un programma come subtitleeditor oppure si può semplicemente creare un file del tipo:
1 00:00:01,500 --> 00:00:06,000 Grecia 2014 2 00:00:26,000 --> 00:00:32,000 Kipi, sulla strada che attraversa lo Zagori
Perchè Mplayer utilizzi la codifica UTF-8 bisogna impostare (Debian 7.7 Wheezy) in /etc/mplayer/mplayer.conf.local
:
utf8=yes
Registrazione video da desktop
Si può utilizzare il programma recordmydesktop, ma con opportuni accorgimenti per evitare artefatti video molto fastidiosi (zone delle schermo che non vengono aggiornate con la dovuta velocità e qualità)
Infine la conversine del formato .ogv in un più diffuso .avi:
ffmpeg -i desktop_recording.ogv -vcodec mpeg4 -sameq desktop_recording.avi
Taglio di spezzoni video (clipping)
Per eseguire in fullscreen una clip di un video, che inizia al minuto 5:42, per la durata di 2 minuti e 10.4 secondi:
mplayer -fs -ss 00:05:42 -endpos 00:02:10.4 file.avi
Per estrarre la stessa clip di cui sopra, senza modificare né l'encoding video né quello audio:
ffmpeg -ss 00:05:42 -i file.avi -vcodec copy -acodec copy -t 00:02:10.4 clip_01.avi
Questa invece la ricetta per estrarre una clip facendo il re-encoding in Xvid, in due passate. Viene specificato il bitrate video (1200 kbit) e qullo audio (128 kbit):
ffmpeg -ss 00:05:42 -y -i file.avi -c:v mpeg4 -vtag xvid -b:v 1200k -pass 1 -an -f avi -t 00:02:10.4 /dev/null ffmpeg -ss 00:05:42 -i file.avi -c:v mpeg4 -vtag xvid -b:v 1200k -pass 2 -c:a libmp3lame -b:a 128k -t 00:02:10.4 clip_01.avi