Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

FFmpeg: guida all'uso

Una guida ad FFmpeg, uno degli strumenti software più utilizzati su Linux per convertire, manipolare, registrare o analizzare file audio e video.
Una guida ad FFmpeg, uno degli strumenti software più utilizzati su Linux per convertire, manipolare, registrare o analizzare file audio e video.
Link copiato negli appunti

Immaginate di volere registrare una breve traccia audio, di volere convertire un qualsiasi file multimediale o di volere estrarre un’immagine molto
significativa da un video. Ci sono molti modi per riuscirci, ma FFmpeg è certamente la principale opzione tra quelle che il mondo di Linux
è in grado di offrire.

FFmpeg è, infatti, uno degli strumenti software più utilizzati su Linux (e non solo) per convertire, manipolare, registrare o analizzare stream e file
audio e video. Utilizzato anche in integrazione con ed in altri software, questo tool ha l’ulteriore vantaggio di essere multipiattaforma,
nonché quello di supportare un grande numero di formati.

Sebbene esistano diversi front-end grafici che rendono più facilmente accessibili alcune funzionalità (Avanti
, FFmpeg GUI e WinFF sono solo alcuni dei primi suggerimenti di
Google), FFmpeg nasce (e cresce) come software a riga di comando. Nel seguito, quindi, vedremo quali sono le possibilità che questa
utility ci offre, e come poterne usufruire direttamente dal terminale.

Figura 1 – L’interfaccia di WinFF, uno dei tanti front-end di FFmpeg (fonte: webupd8.org)
L’interfaccia di WinFF, uno dei tanti front-end di FFmpeg

Installazione

La prima cosa che ci interessa sapere è come installare FFmpeg. Le procedure variano in funzione della distribuzione Linux che
utilizziamo, ma in linea di massima possiamo elencare rapidamente le soluzioni più comuni.

Su Ubuntu (e, in genere, sui sistema da esso derivati, come ad esempio Linux Mint), possiamo sfruttare apt, ed
installare l’ultima versione di FFmpeg con un semplice comando:

[code] sudo apt-get install ffmpeg [/code]

Anche su Fedora il processo di installazione è analogamente semplice, ma questa volta utilizzeremo yum:

[code] su -c 'yum install ffmpeg' [/code]

Per tutti gli altri casi, se non è disponibile un metodo semplice come i precedenti, possiamo scaricare il codice sorgente dell’ultima versione stabile
direttamente dal sito ufficiale, e compilarlo manualmente. Innanzitutto, decomprimiamo l’archivio scaricato con il comando tar:

[code] tar -xvjf ffmpeg-[VERSIONE].tar.bz2 [/code]

Quindi, dopo esserci spostati all’interno della directory generata dal processo di decompressione, non resta che compilare i sorgenti. Per
farlo, eseguiamo in sequenza i comandi seguenti:

[code]./configure
make
su –c ‘make install’[/code]

A questo punto, se tutto è andato per il verso giusto, potremo eseguire FFmpeg senza problemi. Nei prossimi paragrafi, vedremo come sfruttarne le
principali funzionalità.

Utilizzo di base

Per cominciare, vediamo subito come effettuare la conversione di un file .avi in formato .mpg. Questo processo, come capirete presto, è
molto più facile a dirsi che a farsi:

[code] ffmpeg -i file_di_input.avi file_di_output.mpg [/code]

In questo caso, non abbiamo avuto bisogno di specificare nient’altro che il file di input (rappresentato dalla stringa che segue il flag -i) e
quello di output (in questo caso, l’ultimo parametro del comando). Tutto il processo di scelta dei codec (necessari sia per la lettura
dell’input, che per la scrittura dell’output) è automaticamente gestito da FFmpeg, in modo totalmente trasparente all’utente. Lo stesso
esempio fatto poc’anzi, quindi, può essere generalizzato a qualsiasi formato.

Il problema principale di questo genere di possibilità è che i vantaggi derivanti da un elevato livello di astrazione comportano anche l’adozione di una
serie di impostazioni di default, che possono non coincidere con le proprie richieste. Per esempio, il bitrate di default per i file audio
è di 64 kbps, mentre quello dei video è di 200 kbps; in entrambi i casi, si tratta di soluzioni di bassa qualità, e per questo può essere
utile imparare a specificare alcuni dettagli da adoperare, per esempio, in fase di conversione.

Conversione e transcodifica dei file video

Per prima cosa, vediamo quali sono le principali opzioni relative alla conversione dei video, che talvolta rientrano nel campo delle
cosiddette transcodifiche (operazioni che modificano la codifica di un video, il che avviene proprio in fase di conversione). Ogni opzione
di FFmpeg corrisponde ad un opportuno "flag", da specificare nella riga di comando. Di seguito elenchiamo le principali:

  • per specificare il bitrate del video di output, possiamo utilizzare il flag -b, seguito dal valore che
    desideriamo utilizzare:

    [code] ffmpeg -i file_di_input.avi -b 200k file_di_output.mpg [/code]
  • per specificare il frame rate del video di output, utilizziamo il flag -r, seguito dal numero di frame per
    secondo che il video prodotto dovrà avere:

    [code] ffmpeg -i file_di_input.avi -r 60 file_di_output.mpg [/code]
  • per specificare il codec video da utilizzare per la transcodifica, si utilizza il flag -vcodec, seguito dal
    nome del codec (si veda la documentazione per una lista di codec):

    [code] ffmpeg -i file_di_input.avi -vcodec libtheora file_di_output.ogv [/code]

    In generale, FFmpeg dovrebbe essere in grado di capire automaticamente quali codec utilizzare, e quindi spesso può essere omessa questa opzione. Per
    ottenere una lista completa di tutti i formati supportati, si può comunque utilizzare l’opzione -formats:

    [code] ffmpeg -formats [/code]

  • per specificare la risoluzione, si utilizza il flag -s, seguito dalla risoluzione, secondo la sintassi
    LARGHEZZAxALTEZZA (in pixel):

    [code] ffmpeg -i file_di_input.avi -s 1024x768 file_di_output.mpg [/code]

    In alternativa, è comunque possibile utilizzare alcune abbreviazioni; per esempio, 1024x768 corrisponde a xga, e per
    questo il comando precedente è equivalente al seguente:

    [code] ffmpeg -i file_di_input.avi -s xga file_di_output.mpg [/code]

    Per una lista esaustiva delle abbreviazioni compatibili, rimandiamo ad una pagina di linuxers.org;

  • per impostare il rapporto di forma (anche noto come aspect ratio), utilizziamo il flag -aspect, seguito dal
    rapporto nella forma X:Y (dove X rappresenta la larghezza ed Y l’altezza):

    [code] ffmpeg -i file_di_input.avi -aspect 16:9 file_di_output.mpg [/code]

È bene notare che modificare il rapporto di forma può comportare la deformazione del video sia in altezza che in larghezza ( stretching). Per risolvere questo problema, possiamo ricorrere al cropping o al padding del video.
Vediamoli nel dettaglio.

Cropping e padding

Per capire meglio il problema dello stretching, prendiamo ad esempio l’immagine seguente (supponendo che sia uno dei frame di un video a risoluzione
320x240).

Figura 2 – Esempio di frame 320x240
Esempio di frame 320x240

Supponiamo, ora, di volere modificare il video da cui è stata tratta l’immagine precedente, e la cui risoluzione è 320x240, in un video di dimensione
150x400. Possiamo farlo utilizzando il comando seguente:

[code] ffmpeg -i file_di_input.avi -s 150x400 file_di_output.mpg [/code]

Tuttavia il risultato potrebbe risultare spiacevole, proprio a causa della deformazione che questa trasformazione ha causato.

Figura 3 – Esempio di stretching
Esempio di stretching

Possiamo risolvere questo problema effettuando un ritaglio (cropping) di alcune parti di ogni frame del video, o un riempimento (padding) delle porzioni in eccesso, per evitare eventuali distorsioni. Questo genere di operazioni produce
risultati analoghi a quelli dell’immagine che segue.

Figura 4 – Esempio di cropping e padding
Esempio di cropping e padding

Sia il padding che il cropping possono essere effettuati tramite FFmpeg, utilizzando opportunamente alcune delle opzioni incluse nel tool, ed in
particolare alcuni dei cosiddetti filtri:

  • per il cropping, utilizziamo il seguente comando:

    [code] ffmpeg -i file_di_input.avi -filter:v "crop=LARGHEZZA:ALTEZZA:START_X:START_Y" file_di_output.mpg [/code]

    In questo caso, abbiamo sfruttato un filtro video (opzione -filter:v), chiamato crop, tramite il quale possiamo specificare il punto
    di partenza del rettangolo di ritaglio (START_X e START_Y) e le dimensioni dell’area;

  • per il paddding, invece, procediamo come segue:

    [code] ffmpeg -i file_di_input.avi -vf "pad=width=WW:height=HH:x=XX:y=YY:color=black" file_di_output.mpg [/code]

    Questa volta abbiamo utilizzato il filtro pad, col quale è possibile specificare le nuove dimensioni del video (width ed height), la posizione in cui dovrà essere posto il punto in alto a sinistra del video di input (x ed y) ed il colore del
    padding (color). Esistono molte ulteriori opzioni, ma rimandiamo alla pagina della documentazione ufficiale per maggiori dettagli.

Con queste due nuove possibilità, possiamo risolvere il problema dello stretching dovuto al cambio di risoluzione. Aggiungendo pixel in alto, in basso o di
lato (padding), oppure ritagliando porzioni di video (cropping), possiamo far sì che la risoluzione finale abbia lo stesso aspect ratio che vogliamo
ottenere in uscita, risolvendo quindi il problema dello stretching.

Estrarre immagini da un video

Un altro utilizzo tipico di FFmpeg è la possibilità di estrarre un particolare frame da un video, salvandolo come immagine. Il comando da
utilizzare in questo caso è il seguente:

[code] ffmpeg.exe -i file_di_input.avi -ss XX:YY:ZZ -vframes 1 immagine_di_output.png [/code]

Con il flag -ss specifichiamo l’intervallo di tempo dopo il quale prelevare il frame (XX sono i minuti, YY i secondi), mentre
con l’opzione -vframes specifichiamo il numero di frame da estrarre (in questo caso, soltanto uno). Come al solito, il formato dell’immagine di
uscita è valutato in automatico da FFmpeg sulla base dell’estensione.

Una tipica applicazione di questa funzionalità di FFmpeg è la creazione dei thumbnail di anteprima dei video, ovvero l’estrazione di un
frame che possa essere utilizzato dagli utenti per l’identificazione del video, ad esempio al posto di un‘icona standard. In questo contesto, è utile
essere in grado di estrarre non un frame qualsiasi, bensì un frame che sia “abbastanza significativo”. Se pensassimo, ad esempio, di estrarre un frame
casuale, potremmo avere la sfortuna di selezionarne uno monocromatico, o comunque senza un soggetto preciso, risultato pressoché inutile al fine
dell’identificazione del video. Piuttosto, di norma si utilizzano algoritmi di estrazione che scelgono il frame misurandone (in qualche modo) la
significatività o la salienza visiva, e che possono essere anche abbastanza complessi.

FFmpeg include un filtro (chiamato proprio thumbnail) che implementa uno di questi algoritmi (non proprio perfetto, per la verità, ma abbastanza
veloce), e consente di estrarre un frame significativo dal video. Per sfruttarlo, dobbiamo utilizzare il comando seguente:

[code] ffmpeg -i file_di_input.avi -vf "thumbanail" -frames:v 1 immagine_di_output.jpg [/code]

Esistono metodi più sofisticati che sfruttano FFmpeg per
estrarre thumbnail dai video, ma quella che abbiamo appena visto rappresenta comunque una buona soluzione.

Modificare l’audio di un video

Alcune situazioni possono richiedere la rimozione dell’audio da un video. Possiamo sfruttare FFmpeg proprio a questo scopo, con il flag -an, che rimuovere lo stream audio da un file video:

[code] ffmpeg -i file_di_input.avi -an file_di_output.avi [/code]

Così facendo, otterremo un video senza alcuna traccia audio. In altri casi, però, la necessità non è solo quella di rimuovere l’audio, bensì di sostituirlo con un altro. In questo caso, dovremo utilizzare molte delle opzioni già viste, in modo da “assemblare” il comando seguente:

[code] ffmpeg -i audio_di_input.mp3 -i video_di_input.avi -map 0:0 -map 1:0 -acodec copy -vcodec copy -shortest video_di_output.avi [/code]

Qui, con i due flag -map (il primo si riferisce al primo file di input, cioè l’audio, mentre il secondo al video), abbiamo specificato che lo
stream audio dev’essere utilizzato per la generazione dell’output, e che il solo stream video del file video_di_input.avi dev’essere preso in
considerazione. Le opzioni -acodec (di cui parleremo più avanti) e -vcodec, entrambe valorizzate con la parola chiave copy,
indicano che le codifiche di uscita devono essere mantenute uguali alle originali. Infine, l’opzione -shortest limita la lunghezza del file di
output a quella dello stream più breve. Ad esempio, se il file audio dura 30 secondi, ed il video 2 minuti, otterremo un video della durata di soli 30
secondi.

Altre informazioni utili

Possiamo anche far sì che FFmpeg consideri soltanto la prima parte di un video di input, ed operi soltanto su di essa. Per esempio, può essere utile
effettuare una conversione considerando soltanto i primi 30 secondi del video di input. In questo caso, sfruttiamo il flag -t:

[code] ffmpeg -i file_di_input.avi -t 30 file_di_output.mpg [/code]

FFmpeg è molto utile anche per convertire un video in un formato molto complesso e restrittivo, come lo standard utilizzato per iDVD Video, i Video CD e quant’altro (la lista completa dei formati supportati è disponibile sulla documentazione ufficiale). Utilizzando il flag -target, infatti,
abbiamo la possibilità di convertire il video in modo che esso sia automaticamente adattato ad uno dei suddetti standard, in termini di bitrate, codec,
risoluzione e tutto ciò che serve per garantire la compatibilità con i lettori general purpose:

[code] ffmpeg -i file_di_input.avi -target dvd file_di_output.mpg [/code]

Conversione e transcodifica dei file audio

Una volta capito come agire sui video, non ci resta che “ricordarci” che FFmpeg è in grado di operare anche sui file audio. Come fatto in
precedenza, ci occuperemo innanzitutto dei relativi comandi base, elencando alcuni dei flag che consentono, in fase di transcodifica, di specificare le
opzioni principali:

  • per specificare la frequenza del file audio di output, possiamo utilizzare il flag -ar, seguito dal valore
    che desideriamo utilizzare:

    [code] ffmpeg -i file_di_input.wav -ar 44100 file_di_output.wav [/code]
    Il valore che segue il flag -ar va inteso in Hertz (Hz); i valori più comunemente utilizzati sono 22050, 44100 o 48000;
  • per specificare il numero di canali del file audio di output, utilizziamo il flag -ac, seguito dal numero di
    canali dell’output prodotto:

    [code] ffmpeg -i file_di_input.wav -ac 1 file_di_output.wav [/code]
    Questo comando è utilizzato principalmente per trasformare un file stereo nell’equivalente mono (sebbene è altresì possibile
    utilizzarlo per trasformare un file mono nel corrispondente stereo, specificando l’opzione -ac con valore 2). Esistono diverse altre
    possibilità per la manipolazione dei canali audio, ma per maggiori dettagli rimandiamo ad una guida esaustiva dal sito ufficiale di FFmpeg;
  • per specificare il bitrate da applicare al file audio di output, si utilizza il flag -ab, seguito dal valore
    di bitrate opportuno:

    [code] ffmpeg -i file_di_input.wav -ab 128k file_di_output.mp3 [/code]
    Maggiore è il valore del bitrate utilizzato, migliore sarà la qualità dell’audio. D’altro canto, però, aumenterà anche la dimensione
    del file. Questo genere di opzione è utilizzata, quindi, per comprimere i file audio (a scapito della pulizia del suono). Per maggiori
    dettagli sui valori di bitrate più comunemente utilizzati, e sul loro significato in termini pratici, segnaliamo una pagina di mp3-tech.org;
  • per specificare il codec audio da utilizzare per la transcodifica, si utilizza il flag -acodec, seguito dal
    nome del codec (si veda la documentazione per conoscere i codec supportati):

    [code] ffmpeg -i file_di_input.wav -acodec libmp3lame file_di_output.mp3 [/code]
    Anche per i file audio, nella maggior parte dei casi FFmpeg è in grado di capire automaticamente quali codec utilizzare, e quindi l’opzione -acodec viene spesso omessa.

Altre informazioni utili

Può essere utile, in alcune situazioni, estrarre la traccia audio contenuta in un video. Ed FFmpeg, tanto per cambiare, include anche
questo genere di funzionalità: sfruttando l’opzione -vn, infatti, è possibile rimuovere lo stream video da un file, producendo in
output un singolo file audio. Questa operazione può essere eseguita con il seguente comando:

[code] ffmpeg -i file_di_input.avi -vn file_di_output.mp3 [/code]

Un’altra delle tante funzione di FFmpeg è la registrazione dei suoni. Per usufruire di quest’altra opportunità, sfruttiamo un dispositivo
virtuale dei sistemi Linux, identificato con /dev/dsp (che sta per Digital Sound Processor), mediante il quale è possibile ottenere tutti
i suoni provenienti dal microfono (o da un qualche dispositivo di acquisizione). Il comando da utilizzare a questo scopo è il seguente:

[code] ffmpeg -f oss -i /dev/dsp audio_di_output.mp3 [/code]

Il vantaggio è che, in questo modo, otteniamo direttamente il formato che ci interessa in uscita, senza la necessità di dovere convertire, ad esempio, un
file .wav in altri formati (il che è tipico di molti software di registrazione).

Ti consigliamo anche