Differenze tra le versioni di "Ffmpeg"
m (Manipolazione: scaling e bitrate) |
m (→Filtri) |
||
(10 versioni intermedie di 2 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Note | {{Note | ||
|type=attention | |type=attention | ||
− | |text=Pagina super-bozza! | + | |text=Pagina super-bozza! Da integrare o comunque affiancare per bene a [[Conversioni video]] |
− | |||
− | Da integrare o comunque affiancare per bene a [[ | ||
}} | }} | ||
Riga 20: | Riga 18: | ||
}} | }} | ||
− | Oltre ad una serie di parametri informativi su ffmpeg stesso, nell'ultima parte dell'output compaiono | + | Oltre ad una serie di parametri informativi su ''ffmpeg' stesso, nell'ultima parte dell'output compaiono |
le informazioni del file. Vediamo un esempio: | le informazioni del file. Vediamo un esempio: | ||
Riga 61: | Riga 59: | ||
È di tipo ''audio'' con codifica ''mp3'', con sampling a 44100 Hz, di tipo mono e così via. | È di tipo ''audio'' con codifica ''mp3'', con sampling a 44100 Hz, di tipo mono e così via. | ||
− | == | + | |
+ | == Conversione == | ||
L'operazione più semplice è convertire un file in un altro formato. Sia per file audio che video basta specificare l'input e l'output. | 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.avi output.mp4 | ||
Riga 67: | Riga 66: | ||
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...). | 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...). | ||
− | |||
− | |||
− | |||
− | + | == Manipolazione di flussi audio/video == | |
+ | Operazioni di manipolazione possono essere separazione, unione o taglio di 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. | ||
+ | Queste operazioni possono essere eseguite molto rapidamente se si mantiene la codifica del flusso: ''ffmpeg'' effettuerà solo una copia; altrimenti se si sceglie di cambiare codifica sarà necessaria anche una conversione. Per conoscere la codifica si rimanda al paragrafo [[#Informazioni sui file audio/video]]. | ||
+ | |||
+ | La sintassi per mantenere la codifica è: | ||
+ | -vcodec copy ''# Mantiene la codifica video'' | ||
+ | -acodec copy ''# Mantiene la codifica audio'' | ||
+ | -codec copy ''# Mantiene entrambe le codifiche'' | ||
+ | Lo stesso risultato si ottiene con: | ||
+ | -c:v copy | ||
+ | -a:v copy | ||
+ | |||
=== Separare === | === Separare === | ||
− | + | Ricordarsi di scegliere l'estensione giusta per il file di uscita ([[#Informazioni sui file audio/video]]) affinché la copia della codifica abbia effetto. | |
+ | |||
+ | Il parametro <code>-vn</code> elimina il flusso video, <code>-an</code> elimina l'audio. | ||
ffmpeg -i video_in.mkv -vn -acodec copy audio_out.aac | ffmpeg -i video_in.mkv -vn -acodec copy audio_out.aac | ||
− | |||
ffmpeg -i video_in.mkv -vcodec copy -an solo_video_out.mkv | ffmpeg -i video_in.mkv -vcodec copy -an solo_video_out.mkv | ||
− | |||
=== Unire === | === Unire === | ||
In modo simile possiamo unire un flusso audio e un flusso '''solo''' video (senza audio) | 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 | ffmpeg -i solo_video.mkv -i audio.aac -c:v copy -c:a copy video_out.mkv | ||
− | |||
=== Sostituire === | === Sostituire === | ||
Riga 89: | Riga 95: | ||
https://superuser.com/questions/277642/how-to-merge-audio-and-video-file-in-ffmpeg | https://superuser.com/questions/277642/how-to-merge-audio-and-video-file-in-ffmpeg | ||
− | == | + | === Tagliare === |
− | |||
Le opzioni per il taglio sono: | Le opzioni per il taglio sono: | ||
− | * <code>-ss</code>: per specificare l'istante iniziale; | + | * <code>-ss</code>: per specificare l''''istante''' iniziale; |
− | * <code>-t</code>: per specificare | + | * <code>-t</code>: per specificare la '''durata''' del taglio a partire dall'istante iniziale. |
L'istante temporale può essere espresso in secondi oppure in formato esteso '''hh:mm:ss'''. | L'istante temporale può essere espresso in secondi oppure in formato esteso '''hh:mm:ss'''. | ||
− | È possibile anche utilizzare solo una delle due opzioni | + | È possibile anche utilizzare solo una delle due opzioni: in mancanza di <code>-ss</code> il video sarà tagliato dall'inizio per una durata di <code>-t</code>; in mancanza di <code>-t</code> il video sarà tagliato dall'istante <code>-ss</code> fino alla fine. |
− | + | ||
+ | ffmpeg -i video.mkv -ss 00:01:30 -t 10 video_cut.mkv ''# taglia dal minuto 1:30 al minuto 1:40 (10 secondi)'' | ||
+ | ffmpeg -i video.mkv -t 00:05:40 video_cut.mkv ''# taglia i primi 5 minuti e 40 secondi'' | ||
+ | |||
+ | Le opzioni di copia della codifica sono state omesse per brevità. | ||
=== Splitting audio stereo === | === Splitting audio stereo === | ||
Separare un flusso audio stereo in 2 file separati mono: | 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.0 left.mp3 ''# Isola il canale sinistro'' |
− | ffmpeg -i stereo.mp3 -map_channel 0.0. | + | ffmpeg -i stereo.mp3 -map_channel 0.0.1 right.mp3 ''# Isola il canale destro'' |
+ | |||
+ | |||
+ | == Filtri == | ||
+ | I filtri permettono di modificare il flusso audio/video, pertanto sono incompatibili con le opzioni di copia del codec. | ||
+ | La sintassi generale per un filtro video: | ||
+ | -filter:v 'opzione_1=parametro_1,opzione_2=parametro2' | ||
+ | Per un filtro audio si usa <code>-filter:a</code>. Equivalentemente si possono usare <code>-vf</code> per il video e <code>-va</code> per l'audio. | ||
=== Fading === | === 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). | + | 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). |
− | - | + | -filter:v 'fade=in:0:30,fade=out:960:30' |
− | - | + | -filter:a 'afade=in:st=0:d=1,afade=out:st=32:d=1' |
=== Scaling === | === Scaling === | ||
− | Lo scaling consiste nel modificare la risoluzione del video, ovvero cambiare la dimensione x/y proporzionalmente (non c'è un taglio!). | + | 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]]). | 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: | Per modificare la risoluzione portandola ad esempio a ''800x600'' aggiungiamo il parametro: | ||
-vf scale=800:600 | -vf scale=800:600 | ||
+ | |||
+ | Alternativamente, è possibile utilizzare la sintassi | ||
+ | -filter:v scale=1280:-1 | ||
+ | |||
+ | Dove <code>-1</code> farà calcolare automaticamente la seconda dimensione per mantenere la proporzione originale. | ||
+ | |||
+ | === Cropping === | ||
+ | Il ''cropping'' consiste nel ritagliare la dimensione della superficie del video. | ||
+ | |||
+ | -filter:v "crop=<width>:<height>:<x>:<y>" | ||
+ | |||
+ | La sintassi prevede 4 parametri, tutti espressi in pixel: | ||
+ | * <width>: larghezza del riquadro da produrre | ||
+ | * <height>: altezza del riquadro da produrre | ||
+ | * <x>: coordinata orizzontale del vertice '''in alto''' a sinistra del riquadro da produrre | ||
+ | * <y>: coordinata verticale del vertice '''in alto''' a sinistra del riquadro da produrre | ||
+ | |||
+ | '''Attenzione!''' Il riferimento (0,0) delle coordinate (x,y) è il vertice '''in basso''' a sinistra nel frame originario. | ||
+ | |||
+ | === Velocità === | ||
+ | Per modificare la velocità di un flusso video, dobbiamo modificare la durata del ''presentation timestamp'' ('''PTS'''), ovvero la durata dei frame: | ||
+ | ffmpeg -i input.mp4 -filter:v 'setpts=2*PTS' slower.mp4 ''# Raddoppia la durata dei frame -> rallenta il video di 2x'' | ||
+ | ffmpeg -i input.mp4 -filter:v 'setpts=0.5*PTS' faster.mp4 ''# Dimezza la durata dei frame -> accelera il video di 2x'' | ||
+ | |||
+ | === Framerate === | ||
+ | Per modificare il framerate (ad esempio ridurlo da 60fps a 30fps): | ||
+ | ffmpeg -i input.mp4 -filter:v fps=fps=30 output.mp4 | ||
=== Bitrate === | === Bitrate === | ||
Riga 122: | Riga 165: | ||
'''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. | '''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. | ||
+ | |||
+ | [[Category:Howto]] |
Versione attuale delle 10:39, 26 dic 2020
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
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:
$ 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.
Conversione
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...).
Manipolazione di flussi audio/video
Operazioni di manipolazione possono essere separazione, unione o taglio di 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. Queste operazioni possono essere eseguite molto rapidamente se si mantiene la codifica del flusso: ffmpeg effettuerà solo una copia; altrimenti se si sceglie di cambiare codifica sarà necessaria anche una conversione. Per conoscere la codifica si rimanda al paragrafo #Informazioni sui file audio/video.
La sintassi per mantenere la codifica è:
-vcodec copy # Mantiene la codifica video -acodec copy # Mantiene la codifica audio -codec copy # Mantiene entrambe le codifiche
Lo stesso risultato si ottiene con:
-c:v copy -a:v copy
Separare
Ricordarsi di scegliere l'estensione giusta per il file di uscita (#Informazioni sui file audio/video) affinché la copia della codifica abbia effetto.
Il parametro -vn
elimina il flusso video, -an
elimina l'audio.
ffmpeg -i video_in.mkv -vn -acodec copy audio_out.aac ffmpeg -i video_in.mkv -vcodec copy -an solo_video_out.mkv
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
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
Tagliare
Le opzioni per il taglio sono:
-ss
: per specificare l'istante iniziale;-t
: per specificare la durata del taglio a partire dall'istante iniziale.
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 per una durata di -t
; in mancanza di -t
il video sarà tagliato dall'istante -ss
fino alla fine.
ffmpeg -i video.mkv -ss 00:01:30 -t 10 video_cut.mkv # taglia dal minuto 1:30 al minuto 1:40 (10 secondi) ffmpeg -i video.mkv -t 00:05:40 video_cut.mkv # taglia i primi 5 minuti e 40 secondi
Le opzioni di copia della codifica sono state omesse per brevità.
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
Filtri
I filtri permettono di modificare il flusso audio/video, pertanto sono incompatibili con le opzioni di copia del codec. La sintassi generale per un filtro video:
-filter:v 'opzione_1=parametro_1,opzione_2=parametro2'
Per un filtro audio si usa -filter:a
. Equivalentemente si possono usare -vf
per il video e -va
per l'audio.
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).
-filter:v 'fade=in:0:30,fade=out:960:30' -filter:a '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
Alternativamente, è possibile utilizzare la sintassi
-filter:v scale=1280:-1
Dove -1
farà calcolare automaticamente la seconda dimensione per mantenere la proporzione originale.
Cropping
Il cropping consiste nel ritagliare la dimensione della superficie del video.
-filter:v "crop=<width>:<height>:<x>:<y>"
La sintassi prevede 4 parametri, tutti espressi in pixel:
- <width>: larghezza del riquadro da produrre
- <height>: altezza del riquadro da produrre
- <x>: coordinata orizzontale del vertice in alto a sinistra del riquadro da produrre
- <y>: coordinata verticale del vertice in alto a sinistra del riquadro da produrre
Attenzione! Il riferimento (0,0) delle coordinate (x,y) è il vertice in basso a sinistra nel frame originario.
Velocità
Per modificare la velocità di un flusso video, dobbiamo modificare la durata del presentation timestamp (PTS), ovvero la durata dei frame:
ffmpeg -i input.mp4 -filter:v 'setpts=2*PTS' slower.mp4 # Raddoppia la durata dei frame -> rallenta il video di 2x ffmpeg -i input.mp4 -filter:v 'setpts=0.5*PTS' faster.mp4 # Dimezza la durata dei frame -> accelera il video di 2x
Framerate
Per modificare il framerate (ad esempio ridurlo da 60fps a 30fps):
ffmpeg -i input.mp4 -filter:v fps=fps=30 output.mp4
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.