Esempi d’utilizzo di ffmpeg e ffprobe

# Le linee che iniziano con un simbolo diesis sono dei commenti. Le altre linee
# possono essere copiate nel terminale/prompt. Se anche il rinvio alla prossima
# linea viene copiato, allora il comando sarà eseguito immediatamente.



# 0.  Coloro che hanno installato Homebrew su Mac OS X possono aggiornare
#     l'insieme dei programmi installati mediante Homebrew, usando i due
#     comandi che seguono. Il compouer deve ovviamente essere allacciato alla
#     rete.

brew update
brew upgrade --all

#     Si può anche aggiornare soltanto FFmpeg usando:

brew upgrade ffmpeg



# 1.  Definire il desktop quale cartella di lavoro, dove appariranno i file
#     generati, in modo da ritrovarli facilmente e da non dover scrivere il
#     percorso completo.

cd ~/Desktop



# 2.  Generare il film di test con il quale lavoreremo. Si tratta della frattale
#     di Mandelbrot, che permette di notare facilmente gli errori digitali.
#
#     I parametri sono:
#     -f        la libreria predefinita "lavfi" di FFmpeg
#     -i        l'elemento "mandelbrot" della libreria (i = input file)
#     -t        la durata desiderata in secondi oppure un timecode completo
#     -pix_fmt  per la compatibilità con player vecchi
#               e alla fine (senza -o) il nome del file da generare

ffmpeg -f lavfi -i mandelbrot -t 10 -pix_fmt yuv420p mandelbrot.mov



# 3.  Generare le barre nel formato DV per NTSC e per PAL.

ffmpeg -f lavfi -i testsrc -t 10 -target ntsc-dv barre_ntsc.dv
ffmpeg -f lavfi -i testsrc -t 10 -target pal-dv barre_pal.dv

#     Nei dati tecnici che sfilano alla fine, potete constatare che il file
#     "testsrc" è in formato RGB24 e che è stato trasformato:
#     - per DV NTSC: in YUV 4:1:1 con un'immagine di 720 x 480 pixel
#       rettangolari 8:9
#     - per DV PAL:  in YUV 4:2:0 con un'immagine di 720 x 576 pixel
#       rettangolari 16:15
#     Senza dimenticare la velocità di proiezione... Proprio non si tratta della
#     stessa cosa!



# 4.  Generare un file audio.
#
#     Uso un'onda sinusoidale a 440 Hz che corrisponde alla nota la.

ffmpeg -f lavfi -i aevalsrc="sin(440*2*PI*t)" -t 10 nota_la.wav

#     Ma se preferite accordare il vostro strumento usando un diapason a 432 Hz,
#     allora scegliete:

ffmpeg -f lavfi -i aevalsrc="sin(432*2*PI*t)" -t 10 diapason.wav



# 5.  Generare un file con audio e video combinati.
#
#     In questo caso ci sono, ovviamente, due file in entrata.

ffmpeg -i mandelbrot.mov -i nota_la.wav mandelaaa.mov



# 6.  Trasformazione del container. Esempio: da MOV a AVI.
#
#     Parametri:
#     -i  il file d'entrata (i = input file)
#     -c  i tipo di trasformazione da applicare (nel nostro caso nessuna,
#         perché intendiamo modificare il container e non suo contenuto
#         il file di uscita (senza -o)

ffmpeg -i mandelbrot.mov -c copy mandelbrot.avi

#     Altro esempio: da AVI a MPEG-4.

ffmpeg -i mandelbrot.avi -c copy mandelbrot.mp4



# 7.  Trasformazione di formato. Esempio: da 4:3 a 16:9 SENZA mettere le bande
#     nere ai bordi, cioè ciò che NON si dovrebbe fare!

ffmpeg -i mandelbrot.mov -aspect 16:9 difforme.mov

#     Trasformazione corretta con bande nere a destra e a sinistra.

ffmpeg -i mandelbrot.mov -filter:v "pad=854:480:107:0" corretto.mov

#     Varianti politiche:

ffmpeg -i mandelbrot.mov -filter:v "pad=854:480:37:0:ff0000" rosso_sinistra.mov
ffmpeg -i mandelbrot.mov -filter:v "pad=854:480:107:0:00ff00" verde_centro.mov
ffmpeg -i mandelbrot.mov -filter:v "pad=854:480:177:0:0000ff" blu_destra.mov



# 8.  Trasformare i dati "row". Esempio: NTSC e PAL.

ffmpeg -i barre_ntsc.dv -target pal-dv barre_pal_1.dv
ffmpeg -i barre_pal.dv -target ntsc-dv barre_ntsc_1.dv



# 9.  Estrarre i metadati tecnici.
#
#     Parametri:
#     -i              il file d'entrata
#     -show_format    dà il container
#     -show_streams   dà i codec audio e video 
#     -show_data      aggiunge un brevissimo "hexdump" a show_streams
#                     [p.f. non chiedetemi a cosa serva]
#     -show_versions  dà i dettagli del FFmpeg installato

ffprobe -i mandelbrot.mov
ffprobe -i mandelbrot.mov -show_format
ffprobe -i mandelbrot.mov -show_streams
ffprobe -i mandelbrot.mov -show_data
ffprobe -i mandelbrot.mov -show_streams -show_data
ffprobe -i mandelbrot.mov -show_versions
ffprobe -i mandelbrot.mov -show_format -show_streams -show_data -show_versions
ffprobe -i mandelbrot.mov -show_format -show_streams

#     Il formato di uscita può essere definito. Per esempio: "json" può essere
#     usato con Java e "xml" con un foglio di stile XSLT.

ffprobe -i mandelbrot.avi -show_format -show_streams -print_format flat
ffprobe -i mandelbrot.avi -show_format -show_streams -print_format json
ffprobe -i mandelbrot.avi -show_format -show_streams -print_format xml



# 10.  Visualizzare i valori permessi per i parametri.

ffmpeg -codecs
ffmpeg -decoders
ffmpeg -h decoder=flv
ffmpeg -h decoder=flac
ffmpeg -encoders
ffmpeg -filters
ffmpeg -formats
ffmpeg -layouts
ffmpeg -sample_fmts
ffmpeg -pix_fmts
ffmpeg -bsfs



# 11. Calcolare i valori MD5 per ogni immagine di un file.
#
#     Parametro:
#     -f  usare la libreria predefinita "framemd5" di FFmpeg
#
#     Nell'esempio sottostante uso anche comandi terminale per Mac OS X e
#     e Linux, che purtroppo non funzionano con Windows (usare un editore di
#     testo semplice).

md5 -q mandelbrot.mov
md5 -q mandelbrot.avi
ffmpeg -i mandelbrot.mov -f framemd5 mandelbrot_mov_frames.md5
ffmpeg -i mandelbrot.avi -f framemd5 mandelbrot_avi_frames.md5
cat mandelbrot_mov_frames.md5
cat mandelbrot_avi_frames.md5



# 12. Generare dei file ProRes a partire da un file in "YUV uncompressed"
#     (4:2:2 Y'CbCr) senza audio.
#
#     Parametri:
#     -i          il file d'entrata
#     -c:v        il codec video
#     -profile:v  il tipo di codec ProRes:
#                   0 = proxy
#                   1 = light (LT)
#                   2 = standard
#                   3 = high quality (HQ)
#     -an         niente audio
#                 il file d'uscita (senza -o)

ffmpeg -i film_YUV422.mov -c:v prores -profile:v 3 -an film_ProRes.mov



# 13. Generare dei file d'accesso nel formato H.264 da un file in
#     "YUV uncompressed" (4:2:2 Y'CbCr) senza audio.
#
#     Parametri:
#     -i        il file d'entrate
#     -c:v      il codec video
#     -preset   la qualità della compressione (veryslow = migliore qualità
#               possibile; gli altri valori possibili sono: slower, slow,
#               medium, fast, faster, veryfast, superfast, ultrafast)
#     -pix_fmt  per la compatibilità con vecchi player
#     -an       niente audio
#               il file d'uscita (senza -o)

ffmpeg -i film_YUV422.mov -c:v libx264 -preset veryslow -pix_fmt yuv420p -an film_H264.mp4

#     Si può anche limitare il flusso, invece di definire la qualità
#     dell'uscita. Questo è utile, per esempio, se il file viene usato in
#     streaming.
#
#     Parametro:
#     -b:v      la quantità massimale ammessa di bit trasmessi per il video

ffmpeg -i mandelbrot.mov -c:v libx264 -b:v 1000k -pix_fmt yuv420p -an compresso_1000k.avi
ffmpeg -i mandelbrot.mov -c:v libx264 -b:v 10k -pix_fmt yuv420p -an compresso_10k.avi



# 14. Trasformare un file video in singole immagini TIFF...
#
#     Parametri:
#     -f    usare la biblioteca "image2" di FFmpeg che permette di lavorare con
#           singole immagini
#     %05d  un numero a cinque cifre, iniziando con degli zeri se del caso

#     Usiamo un file in formato "raw", in modo da poter visualizzare i file TIFF
#     generati.
#
#     Creare dapprima un folder. [Non so se sotto Windows sia il comando
#     corretto.]
#     Questo passo è importante, perché altrimenti vi ritroverete con 250 file
#     TIFF sul desktop del computer!

ffmpeg -f lavfi -i mandelbrot -t 10 -c:v rawvideo mandelbrot_raw.mov
mkdir TIFF
ffmpeg -i mandelbrot_raw.mov TIFF/mandelbrot_%05d.tif

#     ... e riassemblarle in un file video.

ffmpeg -f image2 -i TIFF/mandelbrot_%05d.tif -c:v rawvideo ricomposto.mov

#     Quindi verifichiamo che i due file siano veramente identici.

md5 -q mandelbrot_raw.mov
md5 -q ricomposto.mov

2016-01-10