Ffmpeg

Da GolemWiki.
Versione del 14 giu 2018 alle 13:26 di Lucam (discussione | contributi) (Splitting audio stereo: typo)
Jump to navigation Jump to search

Golem-template-note-attention.png Pagina super-bozza!

Da integrare o comunque affiancare per bene a Conversioni_video


Sintassi generica

ffmpeg -i input1 [-i input2] [OPZIONI] output

Informazioni sui file audio/video

Indicando solamente il file (o più di uno) di input, saranno visualizzate informazioni

ffmpeg -i video.mp4

In alternativa si può usare il comando dedicato

ffprobe video.mp4

Golem-template-note-info.png Per i più curiosi: il primo comando genera un errore perché ffmpeg richiede un file di output obbligatorio. Quindi anche se le informazioni stampate a schermo sono le stesse, ffprobe le indirizza verso lo stdout mentre ffmpeg le indirizza verso lo stderr. Per questo motivo le informazioni di ffmpeg non sono direttamente fruibili con programmi come grep. Puoi trovare più informazioni sulla redirezione degli stream nel terminale qui.


Oltre ad una serie di parametri informativi su ffmpeg stesso, nell'ultima parte dell'output compaiono le informazioni del file. Vediamo un esempio:

Golem-template-note-example.png

$ ffmpeg -i originale.mkv -i audio.mp3

Input #0, matroska,webm, from 'originale.mkv':
 Metadata:
   ENCODER         : Lavf56.40.101
 Duration: 01:45:56.87, start: 0.000000, bitrate: 263 kb/s
   Stream #0:0: Video: h264 (High), yuv420p(progressive), 1024x768, SAR 1:1 DAR 4:3, 30 fps, 30 tbr, 1k tbn, 60 tbc (default)
   Metadata:
     DURATION        : 01:45:56.866000000
   Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
   Metadata:
     title           : simple_aac_recording
     DURATION        : 01:45:56.78800000
Input #1, mp3, from 'audio.mp3':
  Duration: 01:45:56.85, start: 0.025057, bitrate: 128 kb/s
    Stream #1:0: Audio: mp3, 44100 Hz, mono, s16p, 128 kb/s
    Metadata:
      encoder         : LAME3.100


Input #0 fa riferimento al primo file presente in input (si conta sempre da zero!!). Ci sono informazioni sulla durata, sul bitrate e altro, ma soprattutto il numero di stream presenti in questo file. Il primo stream del primo input è identificato come Stream #0:0:

Stream #0:0: Video: h264 (High), yuv420p(progressive), 1024x768, SAR 1:1 DAR 4:3, 30 fps, 30 tbr, 1k tbn, 60 tbc (default)

È di tipo video con codifica h264, con risoluzione 1024x768 e molto altro.

Il secondo stream del primo input è identificato come Stream #0:1:

Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp (default)

È di tipo audio con codifica aac, con sampling a 44100 Hz, di tipo stereo e altro ancora.

Infine l'unico stream del secondo input, ovvero Input #1:

Stream #1:0: Audio: mp3, 44100 Hz, mono, s16p, 128 kb/s

È di tipo audio con codifica mp3, con sampling a 44100 Hz, di tipo mono e così via.

Convertire

L'operazione più semplice è convertire un file in un altro formato. Sia per file audio che video basta specificare l'input e l'output.

ffmpeg -i input.avi output.mp4
ffmpeg -i input.wav output.mp3

Se non si specificano opzioni, i parametri di conversione saranno stimati dal file di input oppure assunti per default (bitrate, frequenza di campionamento, risoluzione, etc...).

Separare e unire flussi audio/video

Un'operazione molto utile è quella di unire o separare flussi audio/video, ad esempio estrarre l'audio da un file video oppure unire un file video privo di audio con una traccia audio a piacere, oppure ancora sostituire la traccia audio di un file video con un'altra. La sintassi di ffmpeg permette molti modi per far questo, parleremo di alcuni.

Requisito fondamentale è conoscere la codifica degli stream audio e video (vedi paragrafo precedente), così da utilizzare la corretta estensione.

Separare

Estrarre l'audio:

ffmpeg -i video_in.mkv -vn -acodec copy audio_out.aac

Estrarre il video:

ffmpeg -i video_in.mkv -vcodec copy -an solo_video_out.mkv

Quindi l'opzione vn elimina il video, l'opzione an elimina l'audio e le opzioni vcodec copy e acodec copy mantengono il codec video/audio nel file prodotto. Si noti che queste operazioni sono molto veloci! Al contrario, se venisse specificato un formato di destinazione diverso, ffmpeg dovrebbe anche convertire il flusso. Quest'ultimo passaggio può essere costoso in termini di tempo di esecuzione.

Unire

In modo simile possiamo unire un flusso audio e un flusso solo video (senza audio)

ffmpeg -i solo_video.mkv -i audio.aac -c:v copy -c:a copy video_out.mkv

In questo caso sono le opzioni c:v copy e c:a copy a mantenere le codifiche.

Sostituire

Per sostituire l'audio in un video la sintassi cambia ancora.

https://superuser.com/questions/277642/how-to-merge-audio-and-video-file-in-ffmpeg

Manipolazione

Taglio

Le opzioni per il taglio sono:

  • -ss: per specificare l'istante iniziale;
  • -t: per specificare l'istante finale.

L'istante temporale può essere espresso in secondi oppure in formato esteso hh:mm:ss. È possibile anche utilizzare solo una delle due opzioni. In mancanza di -ss il video sarà tagliato dall'inizio fino a -t; idem per la fine. Se si omette l'opzione di inizio, il video verrà tagliato dall'inizio; se si omette l'opzione di fine sarà tagliato fino alla fine dell'originale.

Splitting audio stereo

Separare un flusso audio stereo in 2 file separati mono:

ffmpeg -i stereo.mp3 -map_channel 0.0.0 left.mp3       #Isola il canale sinistro
ffmpeg -i stereo.mp3 -map_channel 0.0.1 right.mp3      #Isola il canale destro

Fading

Il fading, o dissolvenza, può essere applicato sia all'audio (aumento/diminuzione del volume in entrata/uscita) che al video (comparsa/scomparsa del video in entrata/uscita).

-vf 'fade=in:0:30,fade=out:960:30'
-af 'afade=in:st=0:d=1,afade=out:st=32:d=1'

Scaling

Lo scaling consiste nel modificare la risoluzione del video, ovvero cambiare la dimensione x/y proporzionalmente (non c'è un taglio!). La risoluzione attuale è riportata nei metadata del video (vedi sezione #Informazioni sui file audio/video). Per modificare la risoluzione portandola ad esempio a 800x600 aggiungiamo il parametro:

-vf scale=800:600

Bitrate

Il bitrate è il flusso di informazione che il video porta, si misura infatti in bit/s e multipli. Anch'esso è riportato nei metadati. Il bitrate totale sarà la somma del bitrate video più il bitrate audio. Può essere utile agire sul bitrate video per rendere un file più leggero, spesso senza perdere troppo sulla qualità. Per forzare un bitrate ad esempio a 400kbit/s aggiungiamo:

-b:v 400k


Nota: per alcune operazioni semplici viene stampato un messaggio di warning del tipo "Invalid return value 0 for stream protocol". L'operazione è comunque andata a buon fine, controllare sempre la cartella di lavoro per accertarsi che sia presente il file prodotto.