Montaggio video con ffmpeg
Nei mesi scorsi, quando ero in ballo con il progetto DevInPills, mi è capitato di dover montare tre video, concatenandoli uno all’altro, sostanzialmente per ottenere una cosa tipo:
SIGLA DI APERTURA + EPISODIO DEL GIORNO + SIGLA DI CHIUSURA
Ho evitato di cercare un software tradizionale, ma ho preferito puntare su uno strumento che fosse automatizzabile. Leggesi, quindi, da eseguire anche dal prompt dei comandi.
Ho puntato quindi sull’utility ffmpeg che, come dichiara il sito ufficiale, è un “complete, cross-platform solution to record, convert and stream audio and video”. Dalla linea di comandi potete insomma eseguire tantissime operazioni, e come potete immaginare io ne ho imparato una minima parte, quelle che avevo bisogno per finire ciò che mi serviva.
Beh, allora, come si fa?
Supponiamo di avere un folder così composto:
- ffmpeg.exe : è portable, non va installato, basta posizionare l’exe da quasi 40Mb dove vi serve. Comodo.
- In.mp4 : video di apertura del video finale
- Out.mp4 : video di chiusura del video finale
- Produce.ps1 : script Powershell che effettua il montaggio del video
Quello che manca nella cartella qui sopra è “Episode.mp4”, supponiamo che ci sia, e pensiamo ad esso come se fosse la nostra puntata.
Cosa contiene lo script Powershell? E’ semplice!
$InputFile = "Episode.mp4" #-------------------------------------- #Please don't touch these values #-------------------------------------- $ExePath = ".ffmpeg.exe" $OpeningFile = "In.mp4" $EndingFile = "Out.mp4" $FinalFile = "FINAL_" + $InputFile #-------------------------------------- # Concatenate "In.mp4" + $InputFile + "Out.mp4" # Save the result in $FinalFile & $ExePath -i $OpeningFile -i $InputFile -i $EndingFile -filter_complex '[0:v:0] [0:a:0] [1:v:0] [1:a:0] [2:v:0] [2:a:0] concat=n=3:v=1:a=1 [v] [a]' -map "[v]" -map "[a]" $FinalFile
Ci sono un po’ di variabile definite nello script.
- $InputFile : è il nome del file che contiene il nostro episodio
- $ExePath : path dove recuperare ffmpeg.exe
- $OpeningFile : video di apertura
- $EndingFile : video di chiusura
- $FinalFile : nome del file video finale che verrà generato (uso come prefisso “FINAL_” rispetto al nome del file contenuto in $InputFile)
L’ultima linea esegue ffmpeg e procede al concatenamento dei tre video, che come si vede dal commento è un banale “In.mp4” + “Episode.mp4” + “Out.mp4”. La sintassi è alquanto criptica, devo dire. Ovviamente ho cercato la soluzione e poi l’ho adattata ai miei scopi.
Secondo me, se gestite un sito di video (su Facebook, YouTube, etc.) o magari una community che intende pubblicare frequentemente dei video, è uno script più che utile, perchè vi permette di registrare la vostra puntata sotto forma di Episode.mp4, copiare il file nella cartella giusta, lanciare lo script ed in pochi minuti ottenete il video montato, con la sigla di apertura & chiusura.
ffmpeg fa tantissime altre cose (cambio di risoluzioni o di aspect-ratio di un video, cambiamento del bitrate per diminuire la qualità ed ottenere un file più compatto), etc. Googlate e carpite la sintassi che serve ai vostri scopi.