019 Informazioni+Spezzare+Ritagliare+Concatenare+Specchiare+Ruotare+Affiancare – Esempio pratico.

27 Agosto, 2022 (16:03) | ffmpeg, Fotografia digitale, Linux, Video | By: sargonsei

019 Informazioni+Spezzare+Ritagliare+Concatenare+Specchiare+Ruotare+Affiancare – Esempio pratico.
# Cose da sapere prima di cominciare.

1. I parametri dimensionali non specificati sono dedotti da FFmpeg in base alle caratteristiche del video in ingresso, 
    mentre gli altri parametri (es. i codec) sono dedotti da FFmpeg in base all'estensione del video finale,
    tenendo conto di quali sono i parametri disponibili al momento della conversione.
    Di conseguenza, lo stesso comando potrebbe fornire output visivamente diversi 
    se utilizzato su computer diversi, ovvero se impartito prima o dopo un aggiornamento di FFmpeg.
2. I parametri [-acodec copy] e [-vcodec copy] fanno molto di più che 
    impostare, per il file multimediale in uscita, i medesimi codec utilizzati dal file multimediale in entrata.
    Quando FFmpeg imposta valori di default per i parametri NON definiti dall'utente,
    i parametri impostati di default potrebbero essere incompatibili con la funzione principale del comando stesso.
    Di conseguenza, un comando di FFmpeg che utilizza il parametro [-vcodec copy] non sempre è corretto;#    e questo vale anche quando l'utente vuole che il video in uscita faccia uso del medesimo codec del video in entrata.
3- Se non specificamente indicato diversamente, FFmpeg fa in modo che:
   -il file multimediale in uscita abbia come audio l’audio del primo file multimediale in ingresso [0:v].
   -il file multimediale in uscita abbia come durata la durata del primo file multimediale in ingresso [0:v].
4. Se l’utente imposta dimensioni e/o un rapporto dimensionale X:Y diverso dal rapporto X:Y del video in entrata,
    FFmpeg provvede autonomamente sia a modificare la risoluzione, sia a deformare le proporzioni del video prodotto.
5. FFmpeg provvede autonomamente all’eliminazione di ogni porzione di ogni video in ingresso
    che fuoriesce dai margini prestabiliti del video un uscita.
6. Quando l’utente imposta risoluzione e posizione di ogni singolo video in modo che i video si sovrappongono in parte o totalmente,
    FFmpeg farà in modo che, nella parte del video finale in cui si verifica la sovrapposizione,
    il video a cui corrisponde un numero più basso sia coperto dal video a cui corrisponde un numero più alto.

A) Creare una cartella di lavoro e copiare al suo interno il file multimediale videoIN.mp4 che si intende elaborare.
B) Aprire un terminale nella cartella di lavoro ed impartire, uno dopo l’altro, i comandi seguenti:

# 003 Conoscere risoluzione del video in ingresso

mediainfo videoIN.mp4 | egrep -A2 Width # Mostra larghezza, altezza, e rapporto X:Y di un file video chiamato videoIN.mp4
Width                                    : 1 280 pixels
Height                                   : 720 pixels
Display aspect ratio                     : 16:9
$

# 007 Estrarre spezzoni di un video.
ffmpeg -i videoIN.mp4 -to 00:00:08.00 -vcodec copy -acodec copy videoOUTcutF.mp4 # Creare un file .MP4 prendendo la parte che va dall'inizio del file multimediale in ingresso a [-to hh:mm:ss.dc fine taglio] del file multimediale in ingresso, utilizzando i medesimi codec (sia audio, sia video) utilizzati per il file multimediale in ingresso.ffmpeg -i videoIN.mp4 -ss 00:00:08.00 -to 00:00:14.00 -vcodec copy -acodec copy videoOUTcutIF.mp4 # Creare un file .MP4 prendendo la parte che va da [-ss hh:mm:ss.dc inizio taglio] a [-to hh:mm:ss.dc fine taglio] del file multimediale in ingresso, utilizzando i medesimi codec (sia audio, sia video) utilizzati per il file multimediale in ingresso.ffmpeg -i videoIN.mp4 -ss 00:00:14.00 -vcodec libx264 -acodec copy videoOUTcutI.mp4 # Creare un file .MP4 prendendo la parte del file multimediale in ingresso che va da [-ss hh:mm:ss.dc inizio taglio] alla sua fine, utilizzando i medesimi codec (sia audio, sia video) utilizzati per il file multimediale in ingresso.

# 008 Ritagliare la parte di un video visualizzata in una data area del video stesso.
ffmpeg -i videoOUTcutF.mp4 -vf "crop=720:720:300:0" videoOUTcrop1.mp4 # Ritaglia da videoIN.mp4 un video largo 720 pixels ed alto 720 pixels di cui il pixel in alto a sinistra dista 300 pixels dal bordo sinistro e 0 pixels dal bordo superiore del video in ingresso; i parametri non specificati sono dedotti da FFmpeg in base all'estensione del video finale.ffmpeg -i videoOUTcutIF.mp4 -vf "crop=720:720:150:0" videoOUTcrop2.mp4 # Ritaglia da videoIN.mp4 un video largo 720 pixels ed alto 720 pixels di cui il pixel in alto a sinistra dista 150 pixels dal bordo sinistro e 0 pixels dal bordo superiore del video in ingresso; i parametri non specificati sono dedotti da FFmpeg in base all'estensione del video finale.ffmpeg -i videoOUTcutI.mp4 -vf "crop=720:720:300:0" videoOUTcrop3.mp4 # Ritaglia da videoIN.mp4 un video largo 720 pixels ed alto 720 pixels di cui il pixel in alto a sinistra dista 300 pixels dal bordo sinistro e 0 pixels dal bordo superiore del video in ingresso; i parametri non specificati sono dedotti da FFmpeg in base all'estensione del video finale.

# 012 Concatenare files multimediali.
C) Creare, nella cartella di lavoro, un file di testo [listaVideo.txt] contenente il nome dei files multimediali da concatenare.
file 'videoOUTcrop1.mp4' # contiene il video che, nel video finale, apparirà per primo.
file 'videoOUTcrop2.mp4' # contiene il video che, nel video finale, apparirà per secondo.
file 'videoOUTcrop3.mp4' # contiene il video che, nel video finale, apparirà per terzo.

D) Aprire un terminale nella cartella di lavoro ed impartire, uno dopo l’altro, i comandi seguenti:
ffmpeg -f concat -i listaVideo.txt videoOUTconcat.mp4 # Concatena i files multimediali elencati nella lista listaVideo.txt; i parametri non specificati sono dedotti da FFmpeg in base all'estensione del video finale.

# 009 Ruotare e/o specchiare files multimediali.
ffmpeg -i videoIN.mp4 -vf "hflip" -acodec copy -vcodec libx264 vOUTfliph.mp4 # Contiene il video in ingresso specchiato orizzontalmente; i parametri non specificati sono dedotti da FFmpeg in base all'estensione del video finale.ffmpeg -i videoIN.mp4 -vf "vflip" -acodec copy -vcodec libx264 vOUTflipv.mp4 # Contiene il video in ingresso specchiato verticalmente; i parametri non specificati sono dedotti da FFmpeg in base all'estensione del video finale.ffmpeg -i videoOUTconcat.mp4 -vf "transpose=1" -acodec copy -vcodec libx264 vOUTtran1.mp4 # Gira di 90 gradi il video in ingresso, utilizzando il medesimo codec audio utilizzato per il file multimediale in ingresso; i parametri non specificati sono dedotti da FFmpeg in base all'estensione del video finale.

# 013 Creare un file multimediale costituito da vari video, ciascuno dei quali occupa una diversa porzione dello schermo.
E) Volendo creare un file multimediale avente:

    risoluzione video finale:  1280x720 pixels; codec Video: libx264
    Video 0 -> Risoluzione: 640x360 pixels; distanza pixel in alto a sinistra: X=0; Y=0 
    Video 1 -> Risoluzione: 640x360 pixels; distanza pixel in alto a sinistra: X=640; Y=0 
    Video 2 -> Risoluzione: 640x360 pixels; distanza pixel in alto a sinistra: X=0; Y=360 
    Video 3 -> Risoluzione: 360x360 pixels; distanza pixel in alto a sinistra: X=640; Y=360

aprire un terminale nella cartella di lavoro ed impartire il comando seguente:
ffmpeg -i videoIN.mp4 -i vOUTfliph.mp4 -i vOUTflipv.mp4 -i vOUTtran1.mp4 -filter_complex "nullsrc=size=1280x720 [base]; [0:v] setpts=PTS-STARTPTS, scale=640x360 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=640x360 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=640x360 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=360x360 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=640 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=360 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=640:y=360" -vcodec libx264 vOUT4riqUguOrizDiv.mp4

F) Volendo creare un file multimediale avente:

    risoluzione video finale:  1280x720 pixels; codec Video: libx264
    Video 0 -> Risoluzione: 640x360 pixels; distanza pixel in alto a sinistra: X=0; Y=0 
    Video 1 -> Risoluzione: 560x315 pixels; distanza pixel in alto a sinistra: X=640; Y=0 
    Video 2 -> Risoluzione: 400x225 pixels; distanza pixel in alto a sinistra: X=0; Y=360 
    Video 3 -> Risoluzione: 320x180 pixels; distanza pixel in alto a sinistra: X=640; Y=360

aprire un terminale nella cartella di lavoro ed impartire il comando seguente:
ffmpeg -i videoIN.mp4 -i vOUTfliph.mp4 -i vOUTflipv.mp4 -i vOUTtran1.mp4 -filter_complex "nullsrc=size=1280x720 [base]; [0:v] setpts=PTS-STARTPTS, scale=640x360 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=560x315 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=400x225 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x180 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=640 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=360 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=640:y=360" -vcodec libx264 vOUT4riqOrizDiv.mp4