Usare FFmpeg su un file VIDEO per: convertirlo da un formato ad un altro; prelevarne dei pezzi; modificarne la risoluzione

Mar, 09/10/2018 - 08:08
Ritratto di Sargon6

Usare FFmpeg su un file VIDEO per: convertirlo da un formato ad un altro; prelevarne dei pezzi; modificarne la risoluzione

Inviato da Sargon6 0 commenti

In questa guida spiego come sia possibile usare FFmpeg su un file multimediale per: convertirlo da un formato ad un altro; prelevarne dei pezzi; modificarne la risoluzione.
FFmpeg è un'applicazione da riga di comando capace di manipolare files video in base alle opzioni fornite dall'utente.
Le informazioni necessarie ma non fornite, vengono estrapolate da FFmpeg in base alle informazioni fornite.
Se le informazioni fornite sono insufficenti sia per l'esecuzione corretta del comando, sia per consentirne l'estrapolazione, il comando NON viene eseguito, e compare un messaggio di errore.
Se le informazioni fornite, pur essendo insufficienti per l'esecuzione corretta del comando, consentono una dubbia estrapolazione delle informazioni mancanti, il comando viene eseguito, ma durante l'esecuzione da riga di comando compaiono dei messaggi di avvertimento detti "warnings"

Per ricevere informazioni relative alla versione di FFmpeg in uso, co-dec disponibili, opzioni utilizzabili, e caratteristiche di un file video, impartire i comandi

ffmpeg -version        # Versione di FFmpeg in uso
ffmpeg -decoders       # Mostra elenco dei vari decoder utilizzabili per leggere files multimediali
ffmpeg -encoders       # Mostra elenco dei vari encoder utilizzabili per creare files multimediali
ffmpeg -h              # Mostra breve elenco opzioni utilizzabili
ffmpeg -h full         # Mostra elenco completo delle opzioni utilizzabili
ffmpeg -i videoIN.mp4 -hide_banner # Mostra caratteristiche del video videoIN
ffprobe -i videoIN.mp4 # Elenca caratteristiche del file multimediale videoIN.mp4
mediainfo videoIN.mp4  # Elenca caratteristiche del file multimediale videoIN.mp4

Il sistema più semplice per convertire files multimediali da un formato all'altro, prevede che l'utente fornisca ad FFmpeg i seguenti parametri:
nome del comando (nel nostro caso, ffmpeg) deve precedere ogni altro parametro.
nome del file multimediale da elaborare, che, per essere riconosciuto come tale, deve sempre essere preceduto dal parametro -i.
nome del file multimediale che conterrà il prodotto finale dell'elaborazione, che, per essere riconosciuto come tale, non necessita di parametri che lo contraddistinguano.
Per FFmpeg il file multimediale da elaborare è quello preceduto dal parametro "-i". Usare i comandi seguenti per:

ffmpeg -i videoIN.mp4 videoOUT00.avi # Convertire un file dal formato MP4 al formato AVI deducendo Codec ed opzioni varie dall'estensione del file di destinazione.
ffmpeg -i videoIN.mp4 -ss 00:00:20 -to 00:01:20 videoOUT01.mp4 # Creare un file .mp4 prendendo la parte che va da [-ss hh:mm:ss inizio taglio] a [-to hh:mm:ss fine taglio] del file multimediale da elaborare
ffmpeg -i videoIN.mp4 -s 640x360 videoOUT02.mp4 # Modifica la risoluzione di un file multimediale portandola a [-s 640x360].

FFmpeg estrapola i dati utili alla conversione basandosi sull'estensione del nome del file multimediale destinato a contenere il prodotto dell'elaborazione. Data la scarsità di parametri forniti dall'utente, in fase di esecuzione del comando FFmpeg sono apparsi un considerevole numero di "warnings" aventi un testo tipo [Past duration 0.988319 too large], ma l'esecuzione del comando va quasi sempre a buon fine.

I 3 comandi suddetti, possono essere utilizzati in combinazione fra loro per ottenere vari effetti simultaneamente. Usare il seguente comando per:

ffmpeg -i videoIN.mp4 -ss 00:00:00 -to 00:00:20 -s 640x360 videoOUT03.avi # Creare un file .avi prendendo la parte che va da [-ss hh:mm:ss inizio taglio] a [-to hh:mm:ss fine taglio] del file multimediale da elaborare, imponendo come risoluzione [-s 640x360]

Per ridurre o eliminare del tutto i messaggi di "warnings", occorre fornire al comando più parametri possibili.

Impartendo in comando tipo

ffmpeg -i videoIN.mp4 -vcodec mpeg4 -filter:v fps=30 -b:v 644k -r 30 -pix_fmt yuv420p -acodec libmp3lame -b:a 128k videoOUT04.avi # Converte un file dal fommato MP4 al formato AVI utilizzando Codec ed opzioni varie fornite da utente.

L'utente decide i parametri utilizzati da ffmpeg, cosa che elimina il problema dei "warnings".

Per quanto concerne la creazione di spezzoni di video, se si inseriscono i parametri "-vcodec copy -acodec copy", FFmpeg copia tutti i parametri dal file da elaborare e li usa come parametri per il creare lo spezzone di video.

ffmpeg -i videoIN.mp4 -ss 00:00:20 -to 00:01:20 -vcodec copy -acodec copy videoOUT05.mp4 # [-ss hh:mm:ss inizio taglio] [-to hh:mm:ss fine taglio] [codec copiati]

In questo caso, non verrà mostrato alcun "warnings".

In alternativa, anziché il momento del taglio finale usato nel comando precedente, è possibile fornire la durata dello spezzone tagliato; in questo caso, l'istruzione diventa

ffmpeg -i videoIN.mp4 -ss 00:00:20 -t 00:01:20 -vcodec copy -acodec copy videoOUT06.mp4 # [-ss hh:mm:ss inizio taglio] [-t hh:mm:ss durata taglio] [codec copiati]

FFmpeg consente altresì di indicare la durata di uno spezzone in base al momento in cui raggiunge un determinato peso; in questo caso, il comando diventa:
ffmpeg -i videoIN.mp4 -ss 00:00:20 -fs 50M -vcodec copy -acodec copy videoOUT07.mp4 # [-ss hh:mm:ss inizio taglio] [-fs 50M peso, in MB, del file video tagliato] la durata del file video tagliato dipende dal peso impostato.

Per dividere un file multimediale in 3 parti, possiamo usare il comando
ffmpeg -i videoIN.mp4 -to 00:00:20 -vcodec copy -acodec copy videoOUT08a.mp4 -ss 00:00:20 -to 00:00:40 -vcodec copy -acodec copy videoOUT08b.mp4  -ss 00:00:40 -vcodec copy -acodec copy videoOUT08c.mp4 # Divide il file un 3 video, uno che contiene i primi 20 secondi, uno che contiene dal 20esimo al 40esimo secondo, ed uno che contiene dal 40esimo secondo in poi.

Nel caso si voglia modificare la risoluzione di un file multimediale, FFmpeg consente la copia dal file originale dei parametri audio, ma non consente la copia dal file originale dei parametri video, che devono essere omessi oppure estrapolati dall'utente e passati a FFmpeg come parametri.
Per modificare la risoluzione video, al posto dell'opzione "-vcodec copy" occorre usare le opzioni "-vcodec libx264 -filter:v fps=30"
(al posto di libx264, scrivere il nome dell'encoder video che si vuole usare; al posto del numero 30, scrivere il numero del FRAME RATE che si vuole usare)
Infatti il comando:
ffmpeg -i videoIN.mp4 -acodec copy -s 640x360 videoOUT09.mp4 # Modifica la risoluzione di un file multimediale deducendo Codec video ed opzioni varie dall'estensione del file di destinazione, mentre i parametri audio sono copiati dal file multimediale originale
ffmpeg -i videoIN.mp4 -vcodec libx264 -filter:v fps=30 -acodec copy -s 640x360 videoOUT10.mp4 # Modifica la risoluzione di un file multimediale utilizzando il Codec video ed opzioni varie fornite dall'utente, mentre i parametri audio sono copiati dal file multimediale originale

Nel caso si voglia creare uno spezzone di file multimediale avente risoluzione definita dall'utente, si può ricorrere ai comandi seguenti:

ffmpeg -i videoIN.mp4 -ss 00:00:00 -to 00:00:20 -acodec copy -s 640x360 videoOUT11.mp4 # Modifica la risoluzione di uno spezzone di un file multimediale deducendo Codec video ed opzioni varie dall'estensione del file di destinazione, mentre i parametri audio sono copiati dal file multimediale originale
ffmpeg -i videoIN.mp4 -ss 00:00:00 -to 00:00:20 -vcodec libx264 -filter:v fps=30 -acodec copy -s 640x360 videoOUT12.mp4 # Modifica la risoluzione di uno spezzone di un file multimediale utilizzando risoluzione, Codec video ed opzioni varie decise dall'utente, mentre i parametri audio sono copiati dal file multimediale originale

Per trovare altre informazioni, può essere utile leggere qui:
http://guide.debianizzati.org/index.php/FFmpeg
https://ffmpeg.org/ffmpeg.html

ffmpeg -i videoIN.mp4 -ss 00:00:20 -vframes 1 fotogramma01.png