Linux multimedia/Video/Avanzi

Indice del libro

Attenzione. Il materiale in questa sezione è troppo disordinato per essere ritenuto affidabile. Non lo cancello perché intendo copiarlo poco per volta nei posti giusti.

Video editing visuale

modifica

Sapere usare gli strumenti a riga di comando consente di capire a fondo quello che si sta facendo. D'altra parte, è uno dei punti di forza dell'approccio GNU/Linux all'informatica: se voglio, posso vedere che c'è sotto il cofano.

Tuttavia il video editing, cioè il complesso di attività che consente di ottenere un prodotto video rifinito a partire da materiale grezzo, è praticamente impossibile senza strumenti visuali, se non altro perché, per tagliare o incollare delle scene, è inevitabile guardarle.

Inoltre molti strumenti visuali per il video editing sono in grado di gestire gran parte del flusso di lavoro, escludendo per lo più la sola fase di acquisizione vera e propria, ma includendo spesso anche la realizzazione del prodotto che potrà essere inciso su CD o DVD. Forti di quanto sperimentato con gli strumenti a riga di comando, è più facile capire cosa si può fare e non fare, cosa si può pretendere e cosa non si può pretendere dai più pratici strumenti visuali.

Viceversa, può essere proficuo anche l'approccio contrario: provare subito gli strumenti visuali per poi approfondire e specializzare l'uso di quelli a riga di comando.

Vediamo ora qualche applicativo visuale per il video editing.


Si è già accennato a dvdauthor, programma molto completo ma di utilizzo non sempre immediato. dvdstyler è un'interfaccia grafica che sta a dvdauthor come il CD Creator di Nautilus sta a cdrecord. Perdendo parte della flessibilità di dvdauthor, facilita nel contempo la realizzazione di DVD nei casi più tipici. Potendo salvare i progetti secondo il formato XML utilizzato da dvdauthor, può essere utile per semplificare le prime fasi della realizzazione di un DVD per poi modificare manualmente i file XML per arrivare dove dvdstyler non arriva.

Conversione in YUV: lav2yuv

modifica

Il file AVI appena ottenuto non è di solito visibile con un lettore DVD da banco. Molti player software, come MPlayer e Xine, sono in grado di mostrare questo genere di filmati, ed è anzi opportuno dare almeno un'occhiata al risultato prima di procedere, per avere un'idea della sua qualità.

Per poter comprimere il filmato secondo qualche codec, sia esso MPEG 1, 2 o altro, si deve prima convertire il filmato nel formato YUV, appunto con il comando lav2yuv:

# lav2yuv filmato.avi > filmato.yuv

La sigla YUV indica una codifica per le immagini a colori introdotta agli albori della trasmissione televisiva a colori per consentire agli apparecchi in bianco e nero di mostrare comunque le trasmissioni. Per maggiori dettagli si veda l'articolo http://en.wikipedia.org/wiki/YUV. Qui ci limitiamo a dire che, a differenza della codifica RGB, che definisce la luminosità di ognuno dei tre colori fondamentali, la codifica YUV usa un canale per la luminosità (Y, che viene usato da un apparecchio in bianco e nero senza problemi) e due canali per la differenza di luminosità di due opportuni colori rispetto al canale Y (U e V). Di solito i due colori sono il rosso e il blu, ma ci sono altre possibilità, e per ciascun tipo specifico di codifica esistono formule per il passaggio da RGB a YUV e viceversa.

La particolare codifica YUV creata da lav2yuv è nota come Y'CbCr: la C sta per crominanza, mentre b ed r, ovviamente, indicano i colori blu e rosso. È una codifica molto diffusa, spesso sottintentesa, erroneamente, quando si parla di YUV.

Filtri YUV

modifica

Il file filmato.yuv può essere rielaborato con vari comandi della suite, quasi tutti operanti come filtri. Ad esempio, yuvmedianfilter, yuvdenoise, yuvscaler e altri. Essi possono essere combinati fra loro con l'operatore '|' riconosciuto da tutte le shell.

Conversione da YUV a MPEG1/2: mpeg2enc

modifica

Qualunque sequenza di filtri YUV sia stata applicata al file filmato.yuv, prima o poi si vorrà ricavarne un file compresso in MPEG. Questo è il compito del comando mpeg2enc, che consente di ottenere file video per la produzione di VCD, SVCD e DVD. Da notare che non è direttamente gestita la codifica da YUV ai derivati di MPEG4, quali DivX e XVid.

Estrazione dell'audio: lav2wav

modifica

Fin qui abbiamo accennato alla codifica e alla manipolazione dello stream video. Vediamo ora brevemente come codificare anche l'audio.

Il file filmato.avi contiene anche informazioni audio. Esse devono però essere estratte dal file per essere compresse separatamente. Il comando lav2wav fa proprio questo:

# lav2wav filmato.avi > audio.wav

Poiché il risultato è inviato allo standard output, lav2wav può essere usato in combinazione con un codec audio, come ad esempio mp2enc, toolame o lame. Se si vogliono produrre VCD, SVCD o DVD, si possono usare i primi due, mentre per produrre DivX o XVid si può usare lame o altro codec MP3. Ad esempio:

# lav2wav filmato.avi | mp2enc -o audio.mp2

Multiplexing di video e audio: mplex

modifica

Ottenuti due flussi, uno video e uno audio, bisogna combinarli per ottenere un flusso multimediale in cui audio e video siano sincronizzati. In questa fase interviene il comando mplex:

# mplex -f 1 -o filmato.mpg video.m1v audio.mp2

In questo esempio, un video MPEG1 e un audio MPEG1 Layer 2 vengono assemblati per produrre un filmato MPEG1 completo, adatto a realizzare un VCD (-f 1).


Creazione immagine ISO: vcdimager e dvdauthor

modifica

I file ottenuti fino a questo momento possono essere visualizzati da moltissimi riproduttori software, ma non da quelli hardware. Seguendo il caso di esempio fin qui utilizzato, occorre creare una immagine ISO compatibile con la specifica VCD. Questo è compito di vcdimager nel caso in esame, altrimenti di dvdauthor per la creazione di DVD video (come già accennato, i file XviD possono essere incisi su generici CD/DVD dati). Sempre per non complicare troppo l'esempio, restiamo sul caso del VCD, con il semplice comando:

# vcdimager filmato.mpg

il risultato sono due file, videocd.bin e videocd.cue. Il primo contiene i dati veri e propri, l'altro viene usato da cdrdao nella fase successiva.

Incisione immagine ISO: cdrdao e growisofs

modifica

Il semplice comando:

# cdrdao write videocd.cue

incide sul masterizzatore di default (tipicamente /dev/hdc sui sistemi casalinghi) il filmato MPEG1 già organizzato nella fase precedente secondo una immagine ISO compatibile con la specifica VCD. Il risultato è a tutti gli effetti un VCD standard che dovrebbe essere visualizzato dalla maggioranza dei lettori hardware sul mercato.

Acquisizione da VHS e Video8

modifica

Questi due standard per la registrazione analogica di video su nastro sono stati molto popolari in tutto il mondo anche dopo l'avvento del DVD e delle videocamere digitali. In molte famiglie si trovano cospicue raccolte di film, originali o amatoriali, registrati con questi due tipi di standard, o con i loro derivati più avanzati S-VHS e Hi8. Qui ci occuperemo esclusivamente dei formati originali.

Per entrambi, la risoluzione per la versione PAL usata in Europa e in gran parte del mondo è di circa 240 linee orizzontali per 576 linee verticali. Questo rende inutile acquisire un filmato alla piena risoluzione consentita dalle schede di acquisizione. Ad esempio, le schede DC10 e DC30 di Miro/Pinnacle, e le loro versioni plus, equipaggiate con chipset Zoran, a decimazione 1 producono frame di 768x576 punti. Poiché acquisire a piena risoluzione richiede molto spazio su disco, e tempi di rielaborazione più lunghi, è conveniente usare una decimazione pari a 2. Secondo gli autori dei tool, il risultato sarà comunque indistinguibile dall'originale.

Per il formato destinazione, di conseguenza, il DVD non è strettamente necessario, mentre possono essere adeguati il VCD e il SVCD, come anche qualcunque XviD a risoluzione 384x288. Il rapporto fra le dimensioni, comunque, deve essere 4/3, quello di VHS e Video8.

Un fattore determinante nella scelta è però anche la versatilità del risultato: da questo punto di vista il DVD è superiore a tutti gli altri, grazie a menù, sottotitoli, tracce audio multiple e tante altre possibilità. Anche VCD e SVCD offrono qualcuna di queste, mentre XviD, sotto questo aspetto, è limitatissimo.

Creazione di un semplice VCD

modifica

Partendo da VHS e Video8, un formato certamente da provare è il VCD. Questa specifica prevede anche un minimo di funzionalità paragonabili a quelle dei DVD, fra cui capitoli, menù e sottotitoli. Qui ci limiteremo al caso più elementare: produrre un VCD con un unico filmato corrispondente all'intero flusso acquisito dalla fonte.

Nota bene. Nelle condizioni descritte di seguito, è possibile riversare una video cassetta di un'ora. Durate superiori possono portare a filmati troppo grandi per essere incisi su CD.

Per questo esempio, oltre al pacchetto mjpegtools, occorrono anche vcdimager, per la creazione dell'immagine VCD, e cdrdao, per l'incisione di tale immagine su CD. Tutti gli altri comandi fanno parte del pacchetto mjpegtools.

Collegata la sorgente al computer, si può procedere con i seguenti comandi:

$1> lavrec -d 2 filmato-%02d.avi
$2> lav2yuv filmato-*.avi | yuvscaler -O VCD | mpeg2enc -f 1 -o video.m1v
$3> lav2wav filmato-*.avi | mp2enc -b 96 -V -o audio.mp2
$4> mplex -f 1 -o filmato.mpg video.m1v audio.mp2
$5> vcdimager filmato.mpg
$6> cdrdao dev=/dev/hdc write videocd.cue

Per prima cosa, nella riga 1, si acquisisce il filmato come MJPEG a decimazione 2 (-d 2). Il risultato sarà contenuto in file AVI (determinato automaticamente in base all'estensione *.avi) nei file filmato-01.avi, filmato-02.avi e così via (grazie alla sintassi printf-like nel nome del file).

L'acquisizione, nell'ipotesi ideale, dovrebbe essere real-time. Effettuarla come utente, magari da un terminale aperto in un desktop manager, forse non è molto prudente, anche quando si usa una scheda che effettua la digitalizzazione senza interessare la CPU. Infatti, se per qualche motivo il sistema operativo sta intensamente lavorando su disco, può non avere il tempo di salvare un frame, che quindi viene perso. Questo si può controllare esaminando l'output progressivo di lavrec, che riporta in tempo reale il numero di frame persi. L'ideale sarebbe lavorare in single user mode. Se vanno persi troppi frame, anche a decimazione 2, si è forse di fronte ad un disco troppo lento o a qualche altro collo di bottiglia.

Alla riga 2 si procede a creare un video MPEG1 (video.m1v) a partire dai file creati da lavrec. Il video è nel formato VCD (opzione -f 1 di mpeg2enc), scalato in modo da avere le giuste dimensioni (opzione -O VCD di yuvscaler). Questa fase può durare parecchio, e durerebbe molto di più se il filmato venisse acquisito a decimazione 1, ragione di più per evitare questo inutile valore. Naturalmente, meno è impegnato il sistema, meno impiegherà a completare questa fase, ma almeno non c'è rischio di perdita di frame. I tre comandi implicati nella pipeline producono una diagnostica piuttosto prolissa: dopo aver acquisito una certa pratica si può decidere di dirigerla su /dev/null, ripristinandola se qualcosa va storto.

Nella riga 3 l'audio del filmato viene acquisito e salvato nel file audio.mp2. Non essendo ammesso il popolare formato MP3 in un VCD, si deve usare il formato MPEG1 Layer 2 (comando mp2enc). In questo caso si è assunto che l'audio fosse mono, per cui mp2enc ammette solo certi valori del bitrate, fra cui 96 (opzione -b 96). Per la maggior parte delle videocamere amatoriali, questo valore dovrebbe essere ampiamente sufficiente. Il formato del file audio, infine, è compatibile con la specifica VCD (opzione -V di mp2enc).

I due flussi, video e audio, vanno ora fusi in un file multimediale (riga 4). A questo scopo si usa il comando mplex con l'opzione -f 1 che imposta opportunamente tutti i parametri richiesti per un VCD. Questa operazione di solito è relativamente rapida.

Le ultime due fasi sono quelle che dovrebbero riservare minori sorprese: il file multimediale filmato.mpg viene elaborato con vcdimager per creare un'immagine ISO conforme alla specifica VCD, pronta per essere incisa su CD con cdrdao. Il primo comando crea due file videocd.*: un *.bin, contenente l'immagine ISO vera e propria, e un *.cue utilizzato come guida da cdrdao per creare le opportune tracce del CD. Naturalmente il nome del device dipende dal sistema locale, anche se quello dell'esempio è molto plausibile.

Creazione di VCD con menù e sottotitoli

modifica

Creazione di DivX/XviD a singolo passo

modifica

Con l'aggiunta di altri due noti pacchetti, transcode ed mplayer, è possibile convertire i filmati acquisiti con lavrec in moltissimi altri formati. Qui esamineremo la conversione nel popolare formato XviD, interpretato da molti lettori DVD successivi al 2004.

In questo caso si dispone di molta maggiore flessibilità. Ad esempio, si può codificare l'audio in MP3, e si può usare un bitrate variabile, risparmiando nelle scene meno movimentate e spendendo di più dove necessario.

Inoltre, il risultato della codifica è un file che deve soltanto essere inciso su CD dati o DVD dati: non è necessario uno strumento come vcdimager, ma solo un programma qualsiasi per la masterizzazione di file system ISO 9660.

Una limitazione del DivX è la mancanza di menù, capitoli e altre funzionalità presenti invece nel VCD.

Se dunque filmato-%02d.avi è il file MJPEG ricavato dall'acquisizione, la seguente riga produce un file filmato-xvid.avi che può essere inciso su un CD-R o un DVD-R (le righe sono spezzate per leggibilità):

# transcode -i filmato-mjpeg.avi -x mplayer \
  -w 415 -y xvid -o filmato-xvid.avi

Vediamo il significato delle singole opzioni.

-i
File di input (per default, /dev/zero). In teoria, esso potrebbe essere anche il dispositivo corrispondente alla scheda di acquisizione, come /dev/video0. Non è ammesso l'uso dello standard input, ma usando delle named pipe è molto facile ovviare a questo inconveniente.
-o
File di output (per default, /dev/null). Non può essere lo standard output, ma si possono usare delle named pipe come per il file di input.
-x
Filtro di input (nell'esempio, quello basato su mplayer, un player in grado di riconoscere un gran numero di formati diversi).
-y
Formato per l'output (nell'esempio, XviD).
-w
Bitrate.

Un parametro che non è possibile specificare, ma che ha comunque grande importanza, è il numero di bit per pixel, abbreviato in bpp. Questo è calcolato secondo la formula seguente:

       bitrate * 1000
bpp  ----------------
       fw * fh * fps 

in cui fw è la larghezza del frame, fh la sua altezza, e fps è il numero di frame al secondo nel risultato finale.

La letteratura, e lo stesso output di transcode, considerano bassi valori inferiori a 0.15, ma molti ritengono che simili valori possano essere validi per certi filmati, e magari non per altri. Certamente è più prudente usare valori superiori. Il valore dell'opzione -w andrebbe quindi ricavato dalla formula sopra dopo aver scelto il bpp.

Nel caso di video acquisito a 384x288, come con una DC30+ o simili, e con 25 frame al secondo, un bpp di 0.15 corrisponde appunto a un bitrate di circa 415.

transcode ha un numero considerevole di altre opzioni, e ancor più di moduli di import/export. Non è possibile qui riprodurre il manuale in linea, ma è praticamente impossibile usare transcode senza averlo consultato più volte.

Creazione di DivX/XviD a doppio passo

modifica

Una notevole potenzialità offerta da transcode è la codifica a doppio passo: in un primo passo, l'input viene esaminato per individuare i valori più opportuni per garantire il bitrate scelto risparmiando spazio dove possibile. In questo modo si migliora il rapporto fra qualità e spazio richiesto, ma ovviamente ci vuole circa il doppio del tempo ad effettuare la codifica.

L'opzione interessante, in questo caso, è -R: se vale 1, viene creato un file di log mentre viene esaminato l'input; se vale 2, il file di log viene utilizzato per creare un output ottimizzato opportunamente. Riprendendo l'esempio visto per la codifica a passo singolo, il primo passo si realizza così:

# transcode -i filmato-mjpeg.avi -x mplayer \
  -w 415 -y xvid,null -R 1

Di solito, il primo passo viene effettuato senza produrre un inutile output (dirottato su /dev/null in mancanza di opzione -o) e senza interpretare la parte audio (-y xvid,null).

Il secondo passo si effettua invece così:

# transcode -i filmato-mjpeg.avi -x mplayer \
  -w 415 -y xvid -R 2 -o filmato-xvid.avi

In teoria, il file filmato-xvid.avi così ottenuto dovrebbe essere più corto di quello ottenuto con la codifica a passo singolo.

Creazione di un semplice DVD (attenzione, devo controllare molte cose)

modifica

Come già accennato, dal punto di vista della versatilità il DVD è imbattibile. Prima però di provare a creare un DVD ricco di tutte o quasi le possibilità offerte da questo standard, è opportuno vedere il caso più semplice, passando poi a situazioni via via più complesse. Cominceremo quindi con la creazione di un DVD costituito da un unico filmato, senza capitoli, menù o altro.

Supponiamo di disporre di file ottenuti con lavrec, diciamo una serie di file 'filmato-01.avi, filmato-02.avi'... nella directory corrente. Come per la creazione di VCD, è necessario estrarre e codificare sia l'audio che il video. Già a questo livello si presentano delle differenze importanti:

  1. l'audio di un DVD è sempre campionato a 48000 Hz, ma lavrec opera ai 44.100 Hz della qualità CD se non gli viene detto altrimenti (opzione -b)
  2. la codifica del video, nel caso più semplice, richiede l'opzione -f 8 per mpeg2enc, che imposta automaticamente i parametri necessaria a produrre un MPEG adatto alla specifica DVD
  3. anche per il multiplexing occorre una specifica opzione per mplex (anche questa è -f 8, come per mpeg2enc)
  4. i file MPEG multimediali devono essere organizzati nella tipica struttura DVD tramite il comando dvdauthor e poi incisi sul supporto con 'growisofs

Pertanto i comandi già visti per la creazione di un semplice VCD diventano ora:

$1> lavrec -d 2 -b 48000 filmato-%02d.avi
$2> lav2yuv filmato-*.avi | yuvscaler -O DVD | mpeg2enc -f 8 -o video.m2v
$3> lav2wav filmato-*.avi | mp2enc -b 224 -V -o audio.mp2
$4> mplex -f 8 -o filmato.mpg video.m2v audio.mp2
$5> dvdauthor -x dvd.xml
$6> growisofs -Z /dev/hdc -dvd-compat dvd/ 

Il comando 5 richiede altre spiegazioni, perché dvdauthor lavora secondo le indicazioni contenute nel file dvd.xml, la cui struttura può essere particolarmente complessa. Il caso in esame è però estremamente semplice, e il file in questione si riduce agli elementi seguenti:

<dvdauthor dest="dvd">
  <vgmg>
    <titleset>
      <title>
        <pbc file="filmato.mpg"/>
      </title>
    </titleset>
  </vgmg>
</dvdauthor>

Il comando 5 produce, nella directory dvd, una gerarchia di file e directory conforme allo standard DVD, e pronta per essere incisa con il comando 6.