Guida - Script di FFmpeg per elaborare files multimediali - Sargon6 - 05/11/2023
In questo post, ho inserito le righe di uno script utilizzabile per elaborare convertire files multimediali utilizzando FFmpeg.
Codice: #!/bin/bash
# ./scriptElaboraVariVideo1.txt
# Questo script serve per applicare le medesime trasformazioni a vari files multimediali
# presenti nella medesima cartella di lavoro.
# conservando intatti i files multimediali.
# Si ricorda che FFmpeg, per stabilire quali siano i parametri di default (quindi non impostati dall'utente):
# - ricava i codec audio e video di default basandosi sull'estensione del file in uscita;
# - ricava i parametri dimensionali di default utilizzando i medesimi parametri del file in entrata;
# quindi tutte le righe dello script relative a parametri per i quali si vuole usare i parametri di default
# devono essere commentate anteponendovi un #.
#
EXT=".mp4" # Imposta estensione di ciascun file multimediale elaborato
PAR0='' # Definisce PAR0 come una variabile vuota
PAR0=' -noautorotate' # Imposta "ignora rotazione automatica"
#
PARAM=""
PAR=' -c:a aac'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Imposta CODEC audio
# PAR=' -c:a copy'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Imposta copia CODEC audio
# PAR=' -an'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Elimina audio
PAR=' -filter:a areverse'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Imposta audio a ritroso
PAR=' -filter:a atempo=2.0'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Imposta la velocità AUDIO moltiplicandola per 2,0
PAR=' -filter:a volume=1.5'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Imposta il volume AUDIO moltiplicandolo per 1,5
PAR=' -filter:a afade=in:st=0:d=1,afade=out:st=32:d=1'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Dissolvenza audio
PARAM=${PARAM/'-filter:a '/'0a0'}; PARAM=${PARAM//' -filter:a '/','}; PARAM=${PARAM/'0a0'/'-filter:a '}; echo 'Opzioni:'$PARAM
#
PAR=' -c:v libx264'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Imposta CODEC video
# PAR=' -vn'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Il file multimediale in uscita sarà privo di video
#
PAR=' -filter:v hflip'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Specchia Destra-Sinistra
PAR=' -filter:v vflip'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Specchia Alto-Basso
PAR=' -filter:v transpose=0'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Specchia e gira di 90 gradi in senso antiorario il video in ingresso
PAR=' -filter:v transpose=1'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Gira di 90 gradi in senso orario il video in ingresso
PAR=' -filter:v transpose=2'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Gira di 90 gradi in senso antiorario il video in ingresso
PAR=' -filter:v transpose=3'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Specchia e gira di 90 gradi in senso orario il video in ingresso
PAR=' -filter:v reverse'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Inverte il senso del video
PAR=' -filter:v rotate=30*(PI/180)'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Ruota di 30 gradi in senso orario ciò che compare nel file multimediale in ingresso, ma lo schermo non viene ruotato.
PAR=' -filter:v setpts=2.0*PTS'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Dimezza la velocità del video
PAR=' -filter:v fade=in:0:30,fade=out:960:30'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Dissolvenza video
PAR=' -filter:v scale=800:600'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Il video in uscita avrà risoluzione 800x600 pixels
PAR=' -filter:v scale=800:-1'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # La larghezza del video in uscita diventa 800 pixels, e l'altezza viene modificata rispettando le proporzioni del video in ingresso
PAR=' -filter:v pad=width=2049:height=1152:x=500:y=300:color=green'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Sovrappone il video in ingresso ad uno sfondo verde largo 2049 pixels ed alto 1152 pixels
PAR=' -filter:v crop=640:360:320:120'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Ritaglia un video largo 640 pixels ed alto 360 pixels di cui il pixel in alto a sinistra dista 320 pixels dal bordo sinistro e 120 pixels dal bordo superiore del video in ingresso
PARAM=${PARAM/'-filter:v '/'0a0'}; PARAM=${PARAM//' -filter:v '/','}; PARAM=${PARAM/'0a0'/'-filter:v '}; echo 'Opzioni:'$PARAM
#
PAR=' -s 800x600'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Il video in uscita avrà risoluzione 640x360 pixels
# PAR=' -ss 10:23:45.67'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Il file multimediale in uscita inizia 10 ore, 23 minuti, 45 secondi e 67 centesimi di secondo dall'inizio del file multimediale in ingresso
# PAR=' -to 12:34:56.78'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Il file multimediale in uscita termina 12 ore, 34 minuti, 56 secondi e 78 centesimi di secondo dall'inizio del file multimediale in ingresso
# PAR=' -t 01:23:45.67'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Il file multimediale in uscita termina 1 ora, 23 minuti, 45 secondi e 67 centesimi di secondo dall'inizio del file multimediale in uscita
# PAR=' -fs 50M'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Il file multimediale in uscita termina quando raggiunge le dimensioni di 50M
#
# PAR=' -map 0:v:0 -map 1:a:0'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Crea file multimediale contenente il video del file multimediale 0 (il primo) e l'audio del file multimediale 1 (il secondo) la cui durata è la medesima del più LUNGO dei due files multimediali in ingresso.
# PAR=' -map 0:v:0 -map 1:a:0 -shortest'; PARAM=$PARAM$PAR; echo 'Opzioni:'$PARAM # Crea file multimediale contenente il video del file multimediale 0 (il primo) e l'audio del file multimediale 1 (il secondo) la cui durata è la medesima del più CORTO dei due files multimediali in ingresso.
#
for VIN in '20231102_223950a.mp4' # Lista files multimediali da elaborare
do
VOUT='prefisso-'${VIN::-4}'-suffisso'$EXT # Imposta nome ed estensione del video elaborato
COMANDO='ffmpeg'$PAR0' -i '$VIN$PARAM' '$VOUT
echo; echo "Ora verrà eseguito il comando"
echo $COMANDO # Visualizza il contenuto della variable COMANDO
$COMANDO # Esegue il comando contenuto della variabile COMANDO
done
#
exit 0 # Lo script termina qui
A scanso di equivoci, preciso che lo script è stato provato con successo con il computer computer seguente:
Codice: $ inxi -S
System:
Host: i7-11390H Kernel: 6.1.0-13-amd64 arch: x86_64 bits: 64
Desktop: Cinnamon v: 5.8.4 Distro: LMDE 6 Faye
$
che ha creato ed eseguito senza alcun problema il comando
Codice: ffmpeg -noautorotate -i 20231102_223950a.mp4 -c:a aac -filter:a areverse,atempo=2.0,volume=1.5,afade=in:st=0:d=1,afade=out:st=32:d=1 -c:v libx264 -filter:v hflip,vflip,transpose=0,transpose=1,transpose=2,transpose=3,reverse,rotate=30*(PI/180),setpts=2.0*PTS,fade=in:0:30,fade=out:960:30,scale=800:600,scale=800:-1,pad=width=2049:height=1152:x=500:y=300:color=green,crop=640:360:320:120 -s 800x600 prefisso-20231102_223950a-suffisso.mp4
tuttavia nel web si trovano molti esempi che danno ad intendere che: su PC diversi, potrebbe essere necessario mettere le opzioni "fra virgolette", ragion per cui il comando diventerebbe
Codice: ffmpeg -noautorotate -i 20231102_223950a.mp4 -c:a aac -filter:a "areverse,atempo=2.0,volume=1.5,afade=in:st=0:d=1,afade=out:st=32:d=1" -c:v libx264 -filter:v "hflip,vflip,transpose=0,transpose=1,transpose=2,transpose=3,reverse,rotate=30*(PI/180),setpts=2.0*PTS,fade=in:0:30,fade=out:960:30,scale=800:600,scale=800:-1,pad=width=2049:height=1152:x=500:y=300:color=green,crop=640:360:320:120" -s 800x600 prefisso-20231102_223950a-suffisso.mp4
Inoltre ho verificato che computer meno potenti di quello da me usato potrebbero non riuscire a elaborare tutti i parametri contemporaneamente; se ciò si verifica, occorre sottoporre il file da elaborare a più conversioni diverse successive, in modo da dilazionare nel tempo il carico di lavoro a cui si sottopone la CPU.
Saluto.
Sargon6
RE: Guida - Script di FFmpeg per elaborare files multimediali - dead - 07/11/2023
Molto specialistico ma interessante.
Grazie per il contributo!
|