FFmpeg Tutorial, Da Zero A 100 in poco tempo

ffmpeg

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.

FFmpeg il coltellino svizzero per editare audio e video (tutorial)

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

Source Stackoverflow

#!/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