User Tools

Site Tools


doc:appunti:linux:video:appunti

Appunti Elaborazione Video

Riferimenti web

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 × 576Rectangular pixel
704 × 576Rectangular pixel
768 x 576PAL 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à) FIXME

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
doc/appunti/linux/video/appunti.txt · Last modified: 2018/01/14 18:43 by niccolo