- FFmpeg Tutorial, Da Zero A 100 in poco tempo
- Iniziamo dall'HELP
- Convertire audio da un formato all’altro (da wav a mp3)
- Convertire video da un formato all’altro (da mkv a mp4)
- Convertire video in audio (da mp4 a mp3)
- Convertire audio in video con immagine statica (da mp3 a mp4 con immagine per podcast su youtube)
- Convertire video in gif (da mkv a gif oppure da mp4 a gif)
- Tagliare audio o video
- Sostituire audio al video
- Regolare i LUFS per Alexa, Youtube e Spotify
- Modificare risoluzione, framerate e bitrate video
- Concatenare più tracce audio
- Mixare più tracce audio in una sola
- Spettro audio (waveform) per video podcast
- Spettro audio per whatsapp story
- Encoding veloce con accelerazione hardware GPU
- Ciclo FOR per comprimere più file
- Ciclo FOR per comprimere più file e modificare il nome
FFmpeg Tutorial, Da Zero A 100 in poco tempo¶
FFmpeg è il coltellino svizzero per editare e convertire audio e video da riga di comando. In questa guida scoprirai:
- che cos’è FFMPEG
- dove scaricare FFMPEG
- come installare FFMPEG su Windows
- come usare FFMPEG da riga di comando
Tutte queste nozioni le puoi imparare direttamente in questo video tutorial in italiano di circa 2 ore, prodotto in collaborazione con Andrea Ciraolo.
Qui sotto trovi la raccolta dei comandi illustrati nel video e che ti permetteranno di sfruttare al massimo questo fantastico tool. Ricorda che i comandi sui sistemi Windows devono essere richiamati con l’estensione .exe: ffmpeg → ffmpeg.exe
Iniziamo dall'HELP¶
Comando per consultare l’help¶
ffmpeg -h full | more
ffmpeg -h encoder=mp3 -hide_banner (encoder/decoder/demuxer/muxer/filter)
ffmpeg -formats audio (audio/video)
ffmpeg -codecs
Comando per info sul file¶
ffmpeg -i file
ffprobe file
FFprobe estrae dettagli in formato testo parsabile¶
Estrai formato e stream del file:
ffprobe -v error -show_format -show_streams input.mp4
Estrai la dimensione del file:
ffprobe -v error -show_entries format=size input.mp4
Comando precedente con output in formato json:
ffprobe -v error -show_entries format=size -print_format json input.mp4
Convertire audio da un formato all’altro (da wav a mp3)¶
ffmpeg -i audio.wav audio.mp3
ffmpeg -i audio.wav -c:a mp3 -b:a 192k -ar 44100 -ac 2 output.mp3
Convertire video da un formato all’altro (da mkv a mp4)¶
Convertire video in mp4¶
ffmpeg -i input.mkv -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 64k -ac 2 out.mp4
ffmpeg -i input.mkv -c:a aac -b:a 128k -c:v libx264 -crf 23 output.mp4
Convertire video in mkv¶
ffmpeg -i input.mp4 -c:v libx264 -crf 18 -c:a aac output.mkv
ffmpeg -i input.mp4 -c:v h264 -c:a aac output.mkv
Convertire video in audio (da mp4 a mp3)¶
ffmpeg -i INPUT.mp4 -vn -c:a mp3 -b:a 192k -ar 44100 -ac 2 OUTPUT.mp3
Selezionare audio multitraccia da file video¶
Maggiori dettagli sullo switch -map sono disponibili a questo link della wiki ufficiale.
ffmpeg -i AAA.mkv -map 0:1 -acodec mp3 -bitrate 128 AAA.mp3
ffmpeg -i AAA.mkv -map 0:1 -c:a mp3 -b:a 192k -ar 44100 -ac 2 AAA.mp3
Convertire audio in video con immagine statica (da mp3 a mp4 con immagine per podcast su youtube)¶
ffmpeg -loop 1 -framerate 2 -i IMMAGINE.jpg -i PODCAST.mp3 -c:v libx264 -preset fast -tune stillimage -crf 18 -c:a copy -shortest -pix_fmt yuv420p output.mp4
Convertire video in gif (da mkv a gif oppure da mp4 a gif)¶
ffmpeg -i video.mkv video.gif
ffmpeg -i video.mkv -r 4 video.gif (-r = framerate per secondo)
ffmpeg -i video.mkv -r 4 -vf scale=640:-1 video.gif (scale a 640*auto)
Tagliare audio o video¶
Dal secondo x per x secondi¶
ffmpeg -i input.mp4 -ss start_seconds -t duration_seconds output.mp4
ffmpeg.exe -i Fireplace-12-hours.mp4 -ss 00:00:00 -t 21600 -c:v copy -c:a copy Fireplace-6-hours.mp4
Dal secondo x al secondo y¶
ffmpeg -i input.mkv -ss start_seconds -to end_seconds output.mp4
ATTENZIONE: ANTEPORRE LO SWITCH DI SEEKING¶
L’ encoder legge il file da t0 (inizio) e perde tempo fin da subito a codificare anche quella parte di video che non ci serve. Evitiamolo spostando lo switch:
ffmpeg -ss [start_seconds] -i input.avi -t [duration_seconds] output.avi
Sostituire audio al video¶
Rimuovere audio dal video¶
ffmpeg -i INPUT.mp4 -c:v copy -an OUTPUT.mp4
Unire stream audio al video¶
ffmpeg -i OUTPUT.mp4 -i AUDIO.wav -shortest -c:v copy -c:a aac -b:a 256k COMBINED.mp4
Attenzione: cosa significa “-shortest”¶
Questo switch stoppa la codifica quando termina lo stream di input più corto.
Regolare i LUFS per Alexa, Youtube e Spotify¶
Tabella valori loudness da osservare sulle piattaforme online¶
Link alla tabella comparativa LUFS per piattaforme online di streaming, Film, TV e Gaming
LUFS per alexa skill flash briefing¶
Link alla documentazione ufficiale Alexa Amazon Skill
ffmpeg -i PODCAST.mp3 -af loudnorm=I=-14:TP=-3:LRA=11:print_format=json -f mp3 PODCAST-Alexa.mp3
LUFS per google home¶
Link alla documentazione ufficiale Google Home
1-pass:
ffmpeg -i PODCAST.mp3 -af loudnorm=I=-16:dual_mono=true:TP=-1.5:LRA=11:print_format=summary -f null -
Qui sotto il risultato:
Input Integrated: -27.2 LUFS # valore da inserire nel comando seguente
Input True Peak: -14.4 dBTP # valore da inserire nel comando seguente
Input LRA: 0.1 LU
Input Threshold: -37.7 LUFS # valore da inserire nel comando seguente
Output Integrated: -15.5 LUFS
Output True Peak: -2.7 dBTP
Output LRA: 0.0 LU
Output Threshold: -26.2 LUFS
Normalization Type: Dynamic
Target Offset: -0.5 LU
2-pass con i valori misurati:
ffmpeg -i PODCAST.mp3 -af loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=-27.2:measured_TP=-14.4:measured_LRA=0.1:measured_thresh=-37.7:offset=-0.5:linear=true:print_format=summary output.wav
Modificare risoluzione, framerate e bitrate video¶
Rimuovere audio al video e ridimensionare a 640px¶
ffmpeg -i input -an -c:v libx264 -crf 26 -vf scale=640:-1 out.mp4
Ridimensionare risoluzione video a 1080p¶
ffmpeg -i input -acodec copy -c:v libx264 -crf 26 -vf scale=1920:1080 out.mp4
Ridurre bitrate video da 5m a 500k¶
ffmpeg -i input.mkv -b:v 500k -c:a copy output.mkv
CRF FACTOR (constant rate factor), quale valore utilizzare¶
########### CRF factor ###########
0 -------- 18 -------- 23 -------- 28 -------- 51
lossless --- better ---||--- worse ---------- worst
Concatenare più tracce audio¶
ffmpeg.exe -i 1.mp3 -i 2.mp3 -i 3.mp3 -i 4.mp3 -filter_complex '[0:0][1:0][2:0][3:0]concat=n=4:v=0:a=1[out]' -map '[out]' AudioUnito.mp3
ATTENZIONE: il primo file 1.mp3 corrisponde a 0:0 e così via.
Mixare più tracce audio in una sola¶
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex ‘amix=inputs=3:duration=first:dropout_transition=3’ OUTPUT
Spettro audio (waveform) per video podcast¶
ffmpeg -y -i audio-podcast.mp3 -loop 1 -i image-fhd-1920x1080.png -filter_complex "[0:a]showwaves=s=1920x150:colors=Yellow:mode=line,format=yuv420p[v];[1:v][v]overlay=0:550[outv]" -map "[outv]" -pix_fmt yuv420p -map 0:a -c:v libx264 -c:a copy -shortest spettro-waveform-ffmpeg-podcast.mkv -hide_banner
Spettro audio per whatsapp story¶
ffmpeg -y -i untitled.ogg -loop 1 -i image_vert.jpg -filter_complex "[0:a]showwaves=s=1920x150:colors=Yellow:mode=line,format=yuv420p[v];[1:v][v]overlay=0:550[outv]" -map "[outv]" -map 0:a -shortest
spettro-waveform-ffmpeg-podcast.mp4 -hide_banner
Comando per shell linux¶
ffmpeg -y -i audio-podcast.mp3 -loop 1 -i image-fhd-1920x1080.png -filter_complex
"[0:a]showwaves=s=1920x150:colors=Yellow:mode=line,format=yuv420p[v]; \
[1:v][v]overlay=0:550[outv]" \
-map "[outv]" -pix_fmt yuv420p \
-map 0:a -c:v libx264 -c:a copy -shortest spettro-waveform-ffmpeg-podcast.mkv \
-hide_banner
Note alla sintassi:
- -y = sovrascrive senza conferma file di output se esistente
- [0] = audio-podcast.mp3
- [1] = image-fhd-1920x1080.png
- 1920x150 = larghezza x altezza waveform/spettro
- overlay=0:350 = 0px da destra, 350px dall’alto
- -hide_banner = non stampa a video le info iniziali, utili ai developer di FFMPEG
Questo è il risultato: Spettro Waveform con FFmpeg (video)
Encoding veloce con accelerazione hardware GPU¶
Per velocizzare encoding o transcode dei video, è possibile utilizzare la potenza di calcolo della GPU.
A questo link è possibile leggere una introduzione alle varie API integrate in FFMPEG per sfruttare questa opportunità. Qui sotto un elenco di comandi da utilizzare sulle GPU dei produttori Intel, Nvidia e AMD.
Check accelerazione hardware¶
ffmpeg -hwaccels
vainfo
Encoding con gpu intel e QSV¶
A questo link Intel illustra come utilizzare l’accelerazione hardware di FFMPEG sulle proprie architetture.
ffmpeg.exe -hwaccel qsv -i input.mkv -c:v h264_qsv -b:v 1M -look_ahead 1 -c:a copy output.mkv # "-look_ahead 1" = migliora la qualità video ma può essere rimosso se non supportato
Encoding con gpu intel e VA-API¶
Dopo qualche esperimento con blue-recorder ho notato che non supporta ancora gli encoder QSV e VA-API.
Ho "rubato" i comandi ffmpeg e li ho adeguati per funzionare su gpu Intel e VA-API.
Il mio notebook:
- Lenovo ThinkPad 13 Gen 2
- Intel Core i3-7100U
- HD Graphics 620
- MX Linux 23.3 ahs
- kernel Linux 6.5.0
- Mesa 23.1.2
- VA-API version 1.18.0
Registrazione flusso video senza audio:
ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0+0,0 -draw_mouse 1 -vaapi_device /dev/dri/renderD128 -vf 'format=nv12,hwupload' -c:v h264_vaapi -qp 23 /home/mauri/Video/VAAPI_video.temp.without.audio.mp4 -y
Registrazione flusso audio:
ffmpeg -f pulse -i default -f ogg /home/mauri/Video/VAAPI_audio.mp4.temp.audio -y
La cattura dei due flussi viene effettuata con il lancio contemporaneo dei due comandi sopraccitati. Per la fusione dei due file prodotti in uno unico, utilizzare il seguente comando:
ffmpeg -i /home/mauri/Video/VAAPI_video.temp.without.audio.mp4 -f ogg -i /home/mauri/Video/VAAPI_audio.mp4.temp.audio -c:v copy -c:a aac /home/mauri/Video/QSV_merged.mp4 -y
Encoding con gpu nvidia (warning da testare)¶
A questo link Nvidia illustra come funziona l’accelerazione hardware di FFMPEG sulle proprie architetture.
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input.mkv -c:v h264_nvenc -b:v 500k -c:a copy output.mkv
Ciclo FOR per comprimere più file¶
Questo ciclo FOR da usare su shell (Linux o Windows WLS).
Campi modificabili:
- filtro per MKV, modificare a piacimento (mkv, mp4, mov)
- mantiene il nome del file sorgente modificando il contenitore di output (MKV -> MP4)
for video in $(ls|grep mkv);
do
ffmpeg -i "${video}" -c:v libx264 -crf 40 -filter:v fps=fps=10 -c:a libopus -application voip -b:a 16k -ac 1 -cutoff 12000 $(echo "${video}"|sed 's/mkv/mp4/');
done
Ciclo FOR per comprimere più file e modificare il nome¶
#!/bin/bash
find . -name '*.wav' | while read f; do
ffmpeg -i "$f" -ab 320k -ac 2 "${f%.*}.mp3"
done
BASH variable expansion: In short, # removes the pattern from the left, % from the right, doubling the symbol makes the matching greedy.
Mnemonic: # is to the left of % on most keyboards.
for name in .webm; do ffmpeg -i "$name" "${name%.}.mp3"; done