====== 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 **[[http://www.debian-multimedia.org/|www.debian-multimedia.org]]**. * [[mplayer]] * [[avidemux]] * [[transcode]] * [[lsdvd]] Mostra la struttura di un DVD Video. * [[dvdbackup]] * [[dvd_rip_and_fix]] * [[subtitleripper]] * [[dvd9to5]] * [[libdvdcss2]] Libreria per la lettura dei DVD protetti dal CSS. * [[regionset]] View and modify the region code of DVD drives. ===== 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 [[http://linuxtv.org/v4lwiki/index.php/Main_Page|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 [[http://linuxtv.org/v4lwiki/index.php/Btaudio|bttaudio]] che fa parte dei driver sound OSS. Ci sono alcune [[http://linuxtv.org/v4lwiki/index.php/Btaudio_kernel_instructions|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 [[http://ffmpeg.mplayerhq.hu/|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 [[wp>MJPEG|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 **[[glossary#css|protezione CSS]]** o il **[[glossary#region_codes|codice di regione]]** diverso dal drive (vedere [[glossary#rpc_mode_2_protection|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 [[wpit>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