Linux multimedia/Video/Transcodifica

Wikibooks, manuali e libri di testo liberi.
Indice del libro

Transcodifica[modifica]

Questa operazione consiste nel convertire un contenuto multimediale dal suo formato originale ad un altro. Non ha molta importanza come sia stato prodotto il contenuto originale: può essere derivato da una acquisizione, ad esempio dalla TV o da una vecchia videocassetta, oppure può trattarsi di un DVD originale, o di una sequenza di istantanee, o altro ancora. In ognuno di questi casi, e a seconda del formato che si vuole ottenere, ci sono operazioni diverse da effettuare, ma molti elementi sono comuni a tutte le situazioni. Questi elementi saranno evidenziati prima di arrivare a illustrare situazioni concrete.

È importante evitare un equivoco: la transcodifica non riguarda solo il video, ma anche l'audio. Quando si lavora su contenuti audio e video è facile dimenticare la componente audio, perché l'elaborazione di quella video è certamente più complessa. Ma è importante prestare massima attenzione anche alla codifica dell'audio, altrimenti è facile avere sorprese molto spiacevoli.

Strumenti per la transcodifica[modifica]

La transcodifica si può effettuare con diversi strumenti, per lo più a riga di comando. Esiste però qualche interfaccia grafica molto interessate che, come sempre in ambiente GNU/Linux, richiama librerie ed applicativi command line, piuttosto che reinventare la ruota.

transcode[modifica]

Uno degli strumenti più universali è certamente transcode. Esso è in grado di gestire una grande varietà di codec, sia in ingresso che in uscita, attraverso appositi moduli. L'architettura modulare di transcode facilita l'utilizzo di librerie esterne, per cui in pratica transcode è diventato un'interfaccia comune a moltissimi programmi e librerie di transcodifica. Almeno per questo vale sicuramente la pena di imparare ad usarlo. In particolare, è in grado di invocare mplayer, ffmpeg, gli mjpegtools e molti altri applicativi e librerie. Un aspetto non proprio gradevole di transcode, condiviso però con tutti gli strumenti analoghi, è dato dalla notevole complessità delle sue opzioni.

dvd::rip[modifica]

Solo per i DVD, dvd::rip è una bella e versatile interfaccia GTK2 per transcode e alcuni altri applicativi scritta in Perl che, nell'insieme, consente di convertire DVD video in tutti i formati previsti da transcode, semplificando notevolmente le operazioni. Un suo punto di forza da non trascurare è l'estrema trasparenza, in perfetto stile Open Source: ogni operazione è perfettamente documentata attraverso un sistema di log che consente al principiante di capire esattamente cosa avviene sotto il cofano, e magari prendere spunto per sviluppare degli shell script più adatti alle proprie specifiche esigenze.

thoggen[modifica]

Per convertire DVD video in formato Theora, è molto valido thoggen, parte del progetto GNOME, con una interfaccia GTK2 molto semplice ed efficace. Non è però trasparente come dvd::rip, anche perché è rivolto all'utenza che non pretende di capire cosa succede, ma semplicemente vuole godersi il risultato.

mjpeg-tools[modifica]

Gli mjpegtools offrono diversi strumenti per la codifica dal codec MJPEG a MPEG-1 e MPEG-2, ma non per convertire da MJPEG a MPEG-4. A questo scopo si può usare comunque transcode, che ha un modulo di importazione per il codec MJPEG e svariati moduli per l'esportazione in varie forme di MPEG-4.

mencoder ed ffmpeg[modifica]

Un altro strumento che vale senz'altro la pena di considerare è mencoder, l'encoder usato dal lettore multimediale mplayer. La sua sintassi è anche più ostica di quella di transcode, ma soprattutto per i codec MPEG-4 mencoder va provato, perché dispone di un numero impressionante di opzioni e funzionalità.

Da una costola del progetto mplayer deriva ffmpeg, altra interessante alternativa da considerare. Consiste di una serie di librerie e di alcuni tool a riga di comando, come mplayer ricchi di opzioni. Condivide con mplayer parte dell'impostazione e del codice, ma ha preso da tempo una strada autonoma. Lo stesso transcode, e molti altri prodotti, può fare da interfaccia per ffmpeg. La doppia effe sta per fast forward, e in effetti, rispetto al codec XviD normalmente usato da transcode e dvd::rip, è più veloce, senza perdere in qualità.

avidemux[modifica]

Questo applicativo grafico merita sicuramente di essere valutato: opera su file AVI, da cui il nome, ma può gestire codec e formati molto diversi. Per ognuno di essi consente di configurare molti filtri. In particolare è in grado di effettuare un clipping visuale, che può essere molto pratico in certe situazioni.

Dispone di alcune scorciatoie per produrre DVD, VCD e simili, impostando automaticamente tutte le opzioni richieste dalla particolare specifica scelta. Nel caso del DVD video, arriva fino all'incisione del DVD sul supporto ottico.

È possibile anche creare delle job list, ed eseguire tutti o alcuni dei job in un momento successivo.

Bitrate e dintorni[modifica]

Si è già parlato del bitrate come misura della quantità di informazione multimediale da elaborare nell'unità di tempo. Parlando specificamente del video, si capisce subito che, dal momento che un video è composto da una sequenza di immagini, e che ciascuna può occupare migliaia di byte, il bitrate video è di solito notevolmente più elevato di quello audio, anche se non ha senso confrontare la qualità audio con la qualità video.

È utile avere un'idea dei valori per il bitrate usati in applicazioni comuni. La tabella riporta questi valori per le specifiche VCD, SVCD e DVD video:

VCD SVCD DVD
1152 ??? 6000-9000

Salvo il caso del VCD, le altre specifiche, e in particolare l'MPEG-4, consentono di specificare bitrate molto diversi.

Inoltre, spesso è possibile usare un bitrate variabile, sfruttando il fatto che nelle scene lente si può ridurre il bitrate senza perdere in qualità, mentre nelle scene più movimentate si può aumentarlo per migliorare la qualità, sempre mantenendo grosso modo costante il valore medio. Normalmente, il bitrate variabile è associato alla cosiddetta codifica a doppio passo. Infatti, per distribuire in modo intelligente il bitrate, occorre un primo passo di codifica per individuare i passaggi più lenti e quelli più veloci, e un secondo passo di codifica che sfrutta queste informazioni per ottenere una migliore distribuzione del bitrate.

Il risultato della codifica a doppio passo ha normalmente le stesse dimensioni che nel caso di un singolo passo, ma una qualità migliore perché i bit superflui sono riutilizzati dove servono. Nel complesso, si può dire che il bitrate è lo stesso se si considera il video nel suo complesso, ma localmente esso varia.

Un ultimo tipo di codifica è quella a quantizzazione costante. Come si è detto nella teoria, la quantizzazione consiste nel trascurare sistematicamente alcuni bit dei coefficienti della DCT di un'immagine. È la fase in cui si ha la vera perdita di informazione nel trattamento del video, e può essere più o meno elevata, ovviamente con una qualità più o meno ridotta. La maggior parte dei codec video prevede la possibilità di specificare la quantizzazione desiderata in fase di codifica (il decoder, infatti, lavorerà comunque su quelli che per lui sono i coefficienti della DCT, sia pure compressi). Si può quindi decidere a priori la qualità che si desidera. Il rovescio della medaglia è che il bitrate, in questo caso, è subordinato alla quantizzazione, e quindi è quasi imprevedibile. Di certo non si possono fare assunzioni sulle dimensioni dei file codificati o sulla banda necessaria a trasmettere uno stream a quantizzazione costante. All'atto pratico è un forma di codifica raramente utilizzata.

bpp (bits per pixel)[modifica]

Si comprende dunque la centralità della nozione di bitrate nelle applicazioni multimediali. Meno facile è riuscire a trovare un compromesso fra qualità, dimensioni dello stream, e bitrate.

Una prima considerazione sensata è che, per conservare grosso modo la stessa qualità, il bitrate deve essere proporzionale sia alle dimensioni dei frame (in pratica all'area dei frame in pixel), sia alla loro frequenza (fps, dall'inglese frames per second). Infatti, se i frame sono grandi, e non si vuole perdere qualità, non si possono comprimere troppo, e quindi servono molti bit al secondo. Al tempo stesso, se i frame al secondo sono tanti, e non si vogliono scartare o comprimere per non perdere qualità, di nuovo servono molti bit al secondo.

Considerazioni simili hanno portato a definire un nuovo parametro, il bpp, dall'inglese bits per pixel, nel modo seguente:

bpp = (bitrate * 1000) / (width*height*fps)

Il numeratore è misurato in bit al secondo, il denominatore sostanzialmente in pixel al secondo, per cui il rapporto ha ben ragione di chiamarsi bit per pixel. Il fattore 1000 serve solo ad evitare numeri con parecchi zeri dopo la virgola.

Il bpp, come si vede, aumenta col bitrate e diminuisce con le dimensioni e la frequenza dei frame. È dunque un'accettabile misura della qualità almeno per i contenuti video (per quelli audio il bitrate basta da solo). Invertendo la formula, si vede che il bitrate, fissata la qualità, è appunto proporzionale alla frequenza e alle dimensioni dei frame.

Trovata una decente misura della qualità del video, si tratta di trovare i valori del bpp più soddisfacenti nelle diverse situazioni. La letteratura del settore, in particolare il sito di dvd::rip e il man di transcode, indica che un bpp attorno a 0.25 corrisponde alla qualità del VHS e dei suoi derivati, mentre valori attorno a 0.4 o 0.5 è corrispondono alla qualità DVD. Ma l'esperienza può portare a scelte molto diverse.

In effetti, applicando la formula che definisce il bpp, si trova che, se 1152 è il bitrate fissato dalla specifica VCD, il corrispondente bpp è pari a 0,45 circa, mentre per il DVD, che ha bitrate 7500, si dovrebbe avere un bpp pari a circa 0,68. Si direbbe quindi che i valori suggeriti siano sottostimati. È però un fatto che transcode, se il bpp risultante è inferiore a 0,15, informa l'utente con un laconico poor fra parentesi proprio all'inizio del suo usuale output.

Ad ogni modo, scelta la qualità adatta alle proprie esigenze, va determinato il bitrate e stimato lo spazio richiesto. Viceversa, come già si accennava sopra, fissato a priori lo spazio disponibile, come ad esempio quando si fa una copia privata di un DVD su un singolo CD da 700 Mb, va ancora determinato il bitrate e stimato il bpp, per avere almeno un'idea di quale prezzo si sta pagando in termini di qualità per rispettare i limiti di spazio.

Sia transcode che mencoder hanno la possibilità di specificare un bitrate negativo: in questo caso il valore da indicare non è il bitrate, ma le dimensioni del file prodotto. L'applicazione determinerà il bitrate opportuno a rispettare questo vincolo. Il rovescio della medaglia è che, almeno nel caso di transcode, non viene fornita alcuna indicazione all'utente circa il bpp risultante, per cui si possono poi avere spiacevoli sorprese.

bpp, bitrate e spazio richiesto[modifica]

È utile avere chiare le relazioni fra questi parametri, per calcolare l'uno o l'altro a seconda delle situazioni. Cominciamo dallo specifico caso in cui siano fissate la qualità e le dimensioni dei frame e si voglia stimare lo spazio richiesto. Assumiamo che il risultato sarà conforme alla specifica PAL e sarà contenuto in un file AVI.

Per prima cosa, occorre ricavare il video bitrate dal bpp e dalle dimensioni dei frame:

video bitrate = width * height * fps * bpp / 1000

Nel caso PAL, in cui fps = 25, si ottiene più semplicemente:

video bitrate = width * height * bpp / 40

Trovato il bitrate relativo alla qualità e alle dimensioni richieste, le dimensioni della componente video del risultato finale dipendono ovviamente dal bitrate e dalla durata del video espressa in secondi:

 size = video bitrate * length

Ovviamente questa è una misura in Kbit, perché il bitrate è normalmente misurato in Kbps. Una misura in Mbyte, più utile nella pratica, si ottiene da questa dividendo per 8 (per ricavare una misura in Kbyte) e poi per 1024 (per ricavare la misura in Mbyte):

 size in Mb = video bitrate * length / (8 * 1024) = bitrate * length / 8192

A questa misura va aggiunta la grandezza della componente audio, che si ricava con una formula identica in cui il bitrate è ovviamente il bitrate audio. Con un'unica formula si può così ricavare il contributo di entrambe le componenti (bitrate a questo punto è la somma dei due bitrate):

 size in Mb = bitrate * length / 8192

Manca però ancora un dettaglio: il contenitore AVI richiede 24 byte per ogni frame. Il numero di frame è semplicemente la durata in secondi moltiplicata per fps, quindi per 25 nel caso PAL. Questo numero va moltiplicato per 24 e poi diviso per 1024*1024 per ottenere una misura in Mbyte. Basta così aggiungere, nella formula sopra, il termine che tiene conto anche del cosiddetto AVI overhead, e semplificare la formula:

size in Mb = bitrate * length / 8192 + length * 25 * 24 / (1024 * 1024)
         = bitrate * length / 8192 + length * 25 * 24 / (128 * 8192)
         = bitrate * length / 8192 + (length / 8192) * 25 * 24 /128
         = bitrate * length / 8192 + (length / 8192) * 25 * 3 /16
         = (bitrate + 75 / 16) * length / 8192 

In tutto questo discorso il bitrate è considerato costante, ma la stima è accettabile anche nel più frequente caso del variable bitrate, usato in quasi tutti i code MPEG-2 ed MPEG-4. Non è invece applicabile nel caso in cui sia fissata la quantizzazione, cioè il livello di compressione dello stream video: in questo caso la lunghezza del file risultante è praticamente imprevedibile.

Vediamo ora la situazione inversa: si vuole che il risultato sia un file AVI di una certa lunghezza (almeno approssimativa) e si vuole determinare il video bitrate che, fissate le dimensioni dei frame, consenta di rispettare questo vincolo.

Poiché lo stream audio ha dimensioni molto minori di quelle dello stream video, possiamo limitarci a calcolare le dimensioni dello stream audio come fosse un dato, piuttosto che cercare di calcolare l'audio bitrate per contenere le dimensioni del file AVI. Le dimensioni dello stream audio sono semplicemente:

audio size = audio bitrate * length / 8 * 1024 = audio bitrate * length / 8192

Dall'analoga formula per la parte video si deve ricavare il bitrate:

 video size = video bitrate * length / 8192 ==>
 video bitrate = video size * 8192 / length

Il problema con questa formula è che non intervengono le dimensioni dei frame, per cui non fornisce una stima della qualità del risultato. Occorre far intervenire il bpp:

 width * height * bpp / 40 = video size * 8192 / length
                   ==> bpp = video size * 8192 * 40 / (width * height * length)
                           = video size * 10 * 2^15 / (width * height * length)

In questo modo, data la dimensione e la durata del video stream e date le dimensioni dei frame, si può avere una stima della qualità del video compresso.

zoom & clip[modifica]

Ci sono situazioni in cui è necessario ridimensionare i frame. Ad esempio, se da un DVD video si vuole ricavare un VCD, i grandi frame caratteristici del DVD devono essere ridotti alle dimensioni fissate dalla specifica VCD (352x288). In altri casi, invece, si può decidere di usare frame più piccoli perché si vuole soltanto realizzare una decente copia di un DVD da usare frequentemente al posto dell'originale, magari riproducendolo su un televisore non grande e nemmeno di elevata qualità.

A prescindere dai motivi, il ridimensionamento dei frame durante la codifica, detto anche zoom, è un'operazione frequente che richiede una certa attenzione. Infatti essa viene effettuata tramite algoritmi di interpolazione la cui velocità è inversamente proporzionale alla qualità. Quindi la codifica con ridimensionamento di alta qualità sarà più lenta di una codifica con ridimensionamento di qualità più modesta.

L'operazione di clip consiste invece nel tagliare i frame solo sui bordi, ed è spesso associata allo zoom. Anche questa operazione può essere fatta meglio o peggio, e può essere meno o più rapida. Di solito tagli multipli di 8 rallentano poco la codifica e sono di buona qualità. Questo dipende dal fatto che la trasformata DCT opera normalmente per blocchi di 8x8 pixel, a loro volta raggruppati in gruppi 2x2 (quindi di 16x16 pixel) detti macroblocchi. Un macroblocco che contiene molti pixel neri perché si trova sul bordo dell'immagine comporta calcoli inutili e costosi, e d'altra parte è davvero difficile notare un taglio sui bordi di qualche pixel, per cui di solito vale la pena di effettuare tagli tali da rendere le dimensioni del video multipli di 8 o meglio ancora di 16.

Al clipping si può assimilare anche un'operazione in pratica opposta: aggiungere bordi neri ai frame.

Applicazioni elementari[modifica]

Vediamo ora come ottenere risultati concreti senza troppo sforzo, sia pur rinunciando a molte caratteristiche avanzate che saranno illustrate più avanti. Supponiamo di lavorare su una singola sequenza, ma tutto può essere ripetuto per creare contenuti divisi in tante sequenza più piccole: un'idea tutt'altro che peregrina, perché non è divertente ripetere una codifica di diverse ore perché proprio alla fine qualcosa è andato storto. Decisamente meglio seguire il detto latino divide et impera, almeno quando i contenuti sono per loro natura divisi in scene ben staccate.

In questi esempi si userà sempre transcode, ma va ricordato che, per molte operazioni, transcode richiama altri applicativi che devono essere disponibili sul sistema. Ad esempio, per la codifica video MPEG-2 transcode richiama mpeg2enc, compreso negli mjpegtools, mentre per la codifica audio richiama mp2enc, sempre degli mjpegtools. In alcuni casi si proporranno anche comandi alternativi, come ad esempio ffmpeg, ma anche questi possono essere richiamati tramite transcode.

Tutte le operazioni illustrate si possono dunque anche effettuare invocando diversi programmi con le opportune opzioni, ma questo modo di procedere non è indicato per il principiante: meglio cominciare con comandi semplici per fare pratica e poi eventualmente divertirsi con comandi più complessi.

Creare VCD e SVCD[modifica]

Con transcode si può codificare una sorgente in VCD tramite un comando come questo:

$ transcode -i source --export_prof vcd-pal -o film

Questo comando assume che source sia una plausibile fonte di contenuti multimediali che transcode sia in grado di riconoscere automaticamente (ci riesce quasi sempre, esaminando parte della sorgente stessa, altrimenti va aiutato con l'opzione -x).

A partire da tale sorgente, il comando produce due file, film.m1v e film.m2a, corrispondenti a uno stream video MPEG-1 e uno stream audio MPEG-1 Layer II. Viene usata la comoda opzione --expor_prof, che automaticamente imposta molte altre opzioni, fra cui le dimensioni dei frame, il bitrate e altro, che altrimenti andrebbero specificate manualmente (per SVCD, basta usare il valore svcd-pal). Il multiplexing può essere poi effettuato con mplex:

$ mplex -o film.mpg film.m1v film.m2a

Il file film.mpg è ora pronto per l'authoring. Sta all'utente decidere se creare tanti brevi filmati da organizzare in capitoli, oppure un unico lungo filmato: l'authoring in pratica non cambia.

In genere è una buona idea dividere in scene anche un filmato che non lo sia già per sua natura, in modo che se qualcosa va storto non andrà perduto l'intero lavoro, ma solo una sua parte. Le operazioni appena descritte andranno semplicemente ripetute per ogni scena, ma tramite qualche semplice script per la shell anche questa operazione può essere molto semplificata.

In un VCD diviso in capitoli, almeno in teoria, la transizione da una scena alla successiva è trasparente allo spettatore, per cui i capitoli diventato in pratica altrettanti punti di accesso ad un unico lungo filmato, anche se in realtà sono essi stessi filmati indipendenti.

In alternativa, si può usare ffmpeg nel modo seguente:

$ ffmpeg -i source -target vcd film.mpg

oppure, per esserecerti di produrre un VCD nel formato PAL:

$ ffmpeg -i source -target pal-vcd film.mpg

L'uso di ffmpeg ha il vantaggio di non richiedere un comando a parte per il multiplexing degli stream audio e video. D'altra parte, ci sono casi in cui transcode è praticamente necessario: ad esempio, quando la sorgente sono delle edit list prodotte dal comando glav degli mjpeg-tools, usato per un semplice editing dei file AVI acquisiti con lavrec da sorgenti analogiche. Mentre ffmpeg non riconosce il formato delle edit list, e opera solo sui singoli file AVI, transcode è in grado di richiamare le librerie degli mjpeg-tools necessarie alla gestione delle edit list, e nello stesso tempo è in grado di utilizzare le librerie di ffmpeg per elaborare le edit list.

Ulteriore alternativa è mencoder, usato come sotto:

$ mencoder source -ovc lavc -lavcopts vcodec=mpeg1video -mpegopts format=mpeg1  -o film.mpg

Va ricordato che neanche mencoder gestisce le edit list.

Creare DVD video[modifica]

Se la specifica VCD può sembrare rigida, quella DVD video lo è anche di più. Un DVD, una volta creato lo stream MPEG multimediale, dev'essere inciso sul supporto secondo una struttura ISO9660 piuttosto contorta, al punto che esistono applicativi, come dvdauthor, che fanno solo questo: creare l'opportuna alberatura.

Prima però vanno prodotti gli stream audio e video:

$ transcode -i source --export_prof dvd-pal -o film

Vengono creati i file film.m2v e film.mpa corrispondenti allo stream video MPEG-2 e allo stream audio MPEG-1 Layer II. Transcode provvede anche a ricampionare l'audio se la frequenza non è 48KHz come previsto dalla specifica. Il multiplexing, ancora una volta, si può fare con mplex:

$ mplex -o film.mpg film.m2v film.mpa

A questo punto tutto è pronto per l'authoring. Come per i VCD, è una buona idea produrre una serie di scene piuttosto che un unico lungo filmato: valgono le stesse considerazioni fatte appunto per i VCD.

Con ffmpeg si può ottenere un risultato lo stesso risultato con un singolo comando, ad esempio:

 $ ffmpeg -i source -target pal-dvd film.mpg

Sarà ffmpeg ad occuparsi in modo trasparente dei due flussi elementari audio e video e del loro multiplexing.

Che si usi transcode o ffmpeg, va sempre considerata la possibilità della codifica a doppio passo. Con transcode si usa l'opzione '-R 1' per il primo passo e '-R 2' per il secondo passo a bitrate variabile ('-R 3' è una terza possibilità che però si riferisce alla quantizzazione costante, poco pratica nella maggior parte delle situazioni reali). Per ffmpeg le opzioni sono invece '-pass 1' e '-pass 2' rispettivamente. In entrambi i casi si può deviare l'output della prima passata su /dev/null perché produrre un file in questa passata non ha molto senso (viene comunque sovrascritto nella seconda passata), e un inutile accesso al disco rallenta le operazioni, anche se non in modo eccessivo.

È poi da considerare l'uso di bitrate video e audio diversi da quelli usuali. In certe situazioni ha senso produrre una copia non eccelsa di un filmato, risparmiando spazio e potendo così mettere su uno stesso DVD svariate ore di filmati.

Creare file XviD[modifica]

Il codec XviD è il cugino open del DivX, un fortunato codec MPEG-4 ormai gestito da tutti i lettori hardware attualmente in commercio. Alcuni dichiarano esplicitamente la compatibilità XviD, ma in realtà anche quelli che non la dichiarano sono di solito compatibili.

Partendo da una sorgente qualsiasi, si può ottenere un file AVI secondo il codec XviD con un comando come:

 $ transcode -i source -k -y xvid -o film.avi

In questo modo le dimensioni dei frame saranno conservate, l'audio sarà automaticamente convertito in MP3 a 128 Kbps, e il bitrate video sarà impostato a 1800 Kbps. Questi valori difficilmente possono essere adatti a qualsiasi situazione, ma per cominciare questo è il modo più semplice. Il risultato sarà subito pronto per essere inciso su CD-R o DVD-R e riprodotto sul televisore. L'opzione -k serve a scambiare il canale del rosso e il canale del blu: va usata nel frequentissimo caso in cui, dopo ore di codifica, si scopre che nel filmato AVI le persone hanno la faccia blu.

L'altra caratteristica che vale la pena di considerare anche in applicazioni elementari è la codifica in due passaggi, che consente di fruttare meglio il bitrate, aumentando così il rapporto qualità/spazio. I comandi sono ora due:

 $ transcode -i source -k -y xvid,null -o /dev/null -R 1
 $ transcode -i source -k -y xvid -o film.avi -R 2

Il primo passo (opzione -R 1)produce un file di log, normalmente denominato divx4.log, che viene poi esaminato durante il secondo passo (opzione -R 2).

Poiché l'output prodotto dal primo passo non è quello definitivo, tanto vale ridirigere l'output su /dev/null. Per lo stesso motivo, non vale la pena di elaborare lo stream audio. L'opzione -y xvid,null serve proprio ad indicare che il primo passo deve usare il codec xvid per il video, e nessun codec (null) per l'audio.

A differenza dei VCD e DVD, i file XviD sono del tutto indipendenti l'uno dall'altro. La maggior parte dei player da tavolo, finito un file, iniziano subito a riprodurre il successivo, ma la transizione è di solito vistosa, per cui dividere un film in scene ognuna su un singolo file comporta una transizione molto vistosa. Per questo motivo, di solito, un film è codificato in XviD com un singolo file AVI.

Con ffmpeg si ottiene un risultato simile con il semplice comando seguente:

$ ffmpeg -i source film.avi

Infatti ffmpeg presuppone che un file AVI debba contenere flussi MPEG-4, e usa il proprio codec compatibile XviD con una serie di opzioni predefinite. In particolare, il bitrate video usato è molto basso (200 kbps, buono al più per la video telefonia), per cui sarà meglio un comando come questo:

$ ffmpeg -i source -b 2000k -ab 128k -ar 44100 film.avi

In questo caso vengono impostati valori plausibili anche per il bitrate audio ('-ab') e per la frequenza di campionamento audio ('-ar').

Estrazione di titoli e capitoli da un DVD-video[modifica]

Talvolta è necessario estrarre solo parte di un DVD-video, ma non si vuole ricorrere a strumenti come dvd::rip perché le finalità sono diverse. In questi casi lo strumento più immediato è certamente tccat, uno dei tanti programmi che accompagna transcode. Ad esempio, se nella directory dvd-dir si trova una struttura DVD-video già pronta (opzione -i dvd-dir), il comando seguente estrae solo il capitolo 5 del titolo 2 (opzione -T 2,5) e ne copia il contenuto nel file cap2-5.mpeg:

tccat -T 2,5 -i dvd > cap2-5.mpeg

Con l'opzione -i si può specificare ovviamente anche il lettore DVD, tipicamente /dev/dvd o /dev/hdc.

Un'alternativa che si può considerare è mplayer, ma esso non sembra in grado di copiare su file un singolo capitolo. Ad esempio, mentre il comando:

 mplayer dvd://2 -chapter 5-5

riproduce solo il capitolo 5 del titolo 2 (la sintassi -chapter s-n specifica i capitoli iniziale e finale), lo stesso comando, modificato solo per salvare lo stream su file, copia in realtà tutti i capitoli dal 5 in poi:

 mplayer dvd://2 -chapter 5-5 -dumpstream -dumpfile cap2-5.mpeg

Se si vuole copiare un intero titolo, mplayer serve perfettamente allo scopo, come negli esempi sopra, salvo per l'opzione -chapter che va omessa.

Applicazioni avanzate[modifica]

Gli esempi visti difficilmente possono fornire risultati pienamente soddisfacenti, ma sono un buon punto di partenza per raggiungere risultati migliori. In questa sezione saranno introdotte alcune nozioni importanti

Un'altra opzione di uso frequente è -Z, che serve a ridimensionare i frame. Questa operazione è piuttosto delicata, nonché impegnativa dal punto di vista computazionale, per cui sarà discussa più in dettaglio nelle applicazioni avanzate. Qui ci limitiamo a illustrare il comando seguente:

 $ transcode -i source -k -y xvid -o film.avi -Z 480x360

che ridimensiona i frame dalle dimensioni originali a 480x360, con un rapporto di 4/3. Questa è una scelta sensata solo se la sorgente ha questo aspect ratio, altrimenti il risultato sembrerà deformato. È d sottolineare il fatto che in questo caso viene usato un algoritmo di altà qualità, ma più lento. Usando invece l'opzione -Z 480x360,fast viene usato un algoritmo più rapido ma più scadente. In molte situazioni la differenza si vede, soprattutto nelle scene movimentate.

Scalatura e normalizzazione della traccia audio[modifica]

In certe situazioni può essere necessario elaborare la traccia audio della sorgente. Ad esempio, il volume può essere troppo alto o troppo basso, oppure la gamma dinamica può essere talmente ampia da rendere non udibili i passaggi a volume più basso o siacevolmente fragorosi quelli a volume più alto.

Con transcode questo è possibile selezionando con l'opzione -J filtri opportuni nel primo passo si individua il fattore di scala, nel secondo il volume viene scalato di questo fattore. I due comandi appena visti vanno leggermente modificati:

transcode -i /media/cdrom -x dvd -T 1,-1 -y xvid -o /dev/null -J astat=file=vrf -R 1
VRF=$(cat vfr)
transcode -i /media/cdrom -x dvd -T 1,-1 -y xvid -o film.avi -s $VRF -R 2

È stato usato il filtro astat, che registra il fattore di scala nel file vrf (Volume Rescale Factor, nome di fantasia). Il contenuto del file viene poi copiato nella variabile di shell VRF che viene poi usata nel secondo passo nell'opzione -s, che consente appunto di riscalare il volume.

È anche possibile aggiungere altre tracce audio al file AVI. La traccia usata da transcode è indicata con l'opzione -a. Se essa manca, si assume la traccia 0. Per creare, ad esempio, un file uguale a film.avi, ma con in più la traccia 1 dello stesso DVD si procede così:

 transcode -i /media/cdrom -T1,-1 -x null -g 0x0 -y raw -a 1 -o traccia1.avi
 avimerge -i film.avi -o film-due-tracce.avi -p traccia1.avi

Ovviamente si assume ancora che il DVD sia montato su /media/cdrom e che il titolo e i capitoli da trattare siano sempre gli stessi. Le opzioni -g 0x0 e -y raw fanno in modo che il file prodotto abbia frame di dimensioni 0, ma traccia audio ricavata dalla traccia 1 del DVD (in questo caso, non riscalata). Il comando avimerge fonde i due filmati, ma siccome il secondo ha in pratica solo parte audio, il risultato è un file AVI con una parte video e due audio.

Da MJPEG a XviD[modifica]

Per codificare in XviD un filmato acquisito o una edit list, occorre il modulo xvid di transcode in export. Un esempio molto semplice, ma poco realistico, è dunque

transcode -i filmato.eli -x lav -y xvid -o filmato.avi

È poco realistico perché assume una serie di valori predefiniti per molti parametri che andrebbero impostati a seconda delle situazioni. Una versione più concreta potrebbe essere ad esempio:

transcode -i filmato.eli -Z704x528 -x lav -w 1659 -y xvid -o filmato.avi

Qui si specificano esattamente le dimensioni dei frame (-Z) e il bitrate (-w).Zx480,fast).

Naturalmente, gli esempi possono essere adattati facilmente alla modalità a doppio passo illustrata più avanti.

Creare DVD video a partire da miniDVD[modifica]

Questa operazione può essere richiesta quando si usa una video camera con miniDVD. Di solito questi sono riscrivibili e l'utente ne porta con sé alcuni di riserva, per poi incidere dei normali DVD video col materiale contenuto in questi miniDVD. Il fatto è che questi ultimi hanno una capacità inferiore alla metà di un normale DVD, e quindi può essere comodo incidere su un DVD il contenuto di due miniDVD, se non di più.

A questo scopo bisogna innanzitutto estrarre da ciascun miniDVD i file VOB. Questo è molto semplice con dvdrip, che consente all'utente di scegliere quali parti estrarre, ma ovviamente si può fare anche con transcode.

Una volta ricavati i VOB, da ciascuno di essi occorre estrarre il flusso audio, il flusso video, ed effettuare nuovamente il multiplexing. Nel successivo authoring, infatti, non si potrebbero usare direttamente i VOB, pur essendo identificabili come dei Program Stream (PS) MPEG, perché dvdauthor lamenta problemi di sincronizzazione su questi file.

Per estrarre i due flussi si può usare tcextract, parte della suite transcode, mentre per il multiplexing si può usare mplex. I comandi sono:

tcextract -i file.vob -x mpeg2 > file.m2v
tcextract -i file.vob -x ac3 > file.ac3
mplex -f8 -o file.mpg file.m2v file.ac3

Il file file.mpg è un MPEG PS adatto allo standard DVD video, e quindi è pronto per l'authoring.

Nella pratica, è probabile che le scene del primo e del secondo miniDVD dovranno essere accodate sul DVD risultante esattamente nell'ordine con cui sono state filmate. Se i VOB ricavati da ciascuno dei miniDVD sono correttamente ordinati fra loro, basta che siano contenuti in directory ordinate secondo l'ordine dei miniDVD: nel caso più semplice, si può pensare di avere una directory A e una directory B, contenenti i VOB del primo e del secondo miniDVD rispettivamente.

Se è questa la situazione, è possibile usare la shell BASH per creare nell'ordine giusto tanti file come file.mpg:

ii=0;
for ff in $(find A B -name *.vob | sort) ; do 
  printf -v gg "%02d" $((ii++));
  gg="file-$gg";
  tcextract -i $ff -x mpeg2 > $gg.m2v;
  tcextract -i $ff -x ac3 > $gg.ac3;
  mplex -f8 -o $gg.mpg $gg.m2v $gg.ac3;
done

Il comando sort è essenziale, perché l'output di find è ordinato secondo la reale posizione di ciascun file su disco, e non alfabeticamente: tutto la procedura fallirebbe, portando a scene ordinate in modo imprevedibile.

Il comando printf crea invece dei suffissi numerici tipo 01, 02 e così via. Il risultato finale sono tanti file del tipo file-01.vob, file.02.vob eccetera quanti sono complessivamente i VOB ricavati dai due miniDVD. Due cifre decimali sono sicuramente sufficienti (a meno di non dover creare un improbabile DVD con più di 100 capitoli).

Problemi e soluzioni[modifica]

Vediamo ora alcuni problemi che si possono presentare e le opzioni utili a risolverli:

Facce blu[modifica]

Fenomeno sorprendente, ma frequente: i canali rosso e blu sono semplicemente scambiati. Si risolve con l'opzione -k.

Campi scambiati[modifica]

Le righe dispari e le righe pari, che nel PAL sono disegnate in due fasi distinte, appaiono scambiate. Caso analogo, quelle pari di un frame finiscono insieme alle dispari del successivo (o viceversa). Problema già visto, risolto tramite un filtro specifico: opzione -J fields=flip.