#!/bin/bash #primo tentativo di concatenazione automatico video, musica, sottotitoli # Bold BBlack='\e[1;30m' # Nero BRed='\e[1;31m' # Rosso BGreen='\e[1;32m' # Verde BYellow='\e[1;33m' # Giallo BBlue='\e[1;34m' # Blu BPurple='\e[1;35m' # Viola BCyan='\e[1;36m' # Ciano BWhite='\e[1;37m' # Bianco Color_Off='\e[0m' # Text Reset reset_console="\E[37;40m" #biancoBold echo -e $BRed'PROGRAMMA shell PER CONCATENAZIONE N.6 VIDEO, IMMISSIONE MUSICALE E SOTTOTITOLI' echo -e $BWhite'Titolo video in ordine di montaggio\n(INVIO per terminare immissione titoli)' pad=1 sonoro=0 while read titolo; do if [ "$titolo" != "" ]; then titoli[${pad}]=$titolo pad=$(( $pad+1 )) else break fi done for ((i=1; i<$pad; i++)) do echo -e $BYellow'['$i']-'${titoli[$i]} done numv=$(($i-1)) echo -e $BWhite'\n Titoli di '$numv' video acquisiti...' echo -e $BRed'Uniformazione formati video attendere...'$BWhite for ((i=1; i=$i; i++)) do if [ "${titoli[$i]}" != "" ] then titolipos=`expr index "${titoli[$i]}" "."` titolipos=$(( $titolipos-1 )) stringa=${titoli[$i]} nuovo=${stringa:0:$titolipos}'uni.mp4' titunif[${i}]=$nuovo echo -e $BYellow${titunif[$i]}$BWhite #comando ffmpeg per uniformazione video ffmpeg -i ${titoli[$i]} -vf scale=1280:720,setsar=1:1 $nuovo else break fi done #adesso si tratta di concatenare: la stringa di concatenazione dipende dal #+numero totale dei video OPTION=$numv case $OPTION in 2 ) stringa='[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]' echo -e $BYellow'ffmpeg -i '${titunif[1]}' -i '${titunif[2]}' -filter_complex "'$stringa'" -map "[outv]" -map "[outa]" complex.mp4' ffmpeg -i ${titunif[1]} -i ${titunif[2]} -filter_complex "$stringa" -map "[outv]" -map "[outa]" complex.mp4 ;; 3 ) stringa='[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[outv][outa]' echo -e $BRed'ffmpeg -i '${titunif[1]}' -i '${titunif[2]}' -i '${titunif[3]}' -filter_complex "'$stringa'" -map "[outv]" -map "[outa]" complex.mp4' ffmpeg -i ${titunif[1]} -i ${titunif[2]} -i ${titunif[3]} -filter_complex "$stringa" -map "[outv]" -map "[outa]" complex.mp4 ;; 4 ) stringa='[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0][3:v:0][3:a:0]concat=n=4:v=1:a=1[outv][outa]' echo -e $BGreen'ffmpeg -i '${titunif[1]}' -i '${titunif[2]}' -i '${titunif[3]}' -i '${titunif[4]}' -filter_complex "'$stringa'" -map "[outv]" -map "[outa]" complex.mp4' ffmpeg -i ${titunif[1]} -i ${titunif[2]} -i ${titunif[3]} -i ${titunif[4]} -filter_complex "$stringa" -map "[outv]" -map "[outa]" complex.mp4 ;; 5 ) stringa='[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0][3:v:0][3:a:0][4:v:0][4:a:0]concat=n=5:v=1:a=1[outv][outa]' echo -e $BBlue'ffmpeg -i '${titunif[1]}' -i '${titunif[2]}' -i '${titunif[3]}' -i '${titunif[4]}' -i '${titunif[5]}' -filter_complex "'$stringa'" -map "[outv]" -map "[outa]" complex.mp4' ffmpeg -i ${titunif[1]} -i ${titunif[2]} -i ${titunif[3]} -i ${titunif[4]} -i ${titunif[5]} -filter_complex "$stringa" -map "[outv]" -map "[outa]" complex.mp4 ;; 6 ) stringa='[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0][3:v:0][3:a:0][4:v:0][4:a:0][5:v:0][5:a:0]concat=n=6:v=1:a=1[outv][outa]' echo -e $BPurple'ffmpeg -i '${titunif[1]}' -i '${titunif[2]}' -i '${titunif[3]}' -i '${titunif[4]}' -i '${titunif[5]}' -i '${titunif[6]}' -filter_complex "'$stringa'" -map "[outv]" -map "[outa]" complex.mp4' ffmpeg -i ${titunif[1]} -i ${titunif[2]} -i ${titunif[3]} -i ${titunif[4]} -i ${titunif[5]} -i ${titunif[6]} -filter_complex "$stringa" -map "[outv]" -map "[outa]" complex.mp4 ;; *) echo -e $BCyan"Hai immesso un solo video oppure piu' di 6 video, che non e' possibile concatenare.\n In caso di maggior numero di video, procedere per gradi, ad esempio concatenandoli in volte\n successive." esac echo -e $BWhite'Se si desidera inserire un commento sonoro indicare nome e percorso file AUDIO.\n Il file audio dovrebbe essere di durata piu lunga della durata del video. Questo programma esegue un controllo in tale senso e, in caso di video piu lungo, viene duplicata la durata\n del file audio. Qualora non fosse sufficiente, la opzione -shortest taglierebbe il video\n per adeguarlo alla lunghezza audio.\n Digitaare INVIO per non aggiungere commento musicale.' read commento if [ "$commento" != "" ] then #una volta acquisito il nome del file audio e necessario che esso sia PIU LUNGO del video ffprobe -i $commento -show_entries format=duration -v quiet -of csv="p=0">duraudio.txt ffprobe -i complex.mp4 -show_entries format=duration -v quiet -of csv="p=0">durvideo.txt filev="durvideo.txt" filea="duraudio.txt" while read -r line; do echo -e $BCyan$line tempovideo=${line} done <$filev echo -e $BRed"Durata del video :"$BYellow$(bc <<<"$tempovideo") while read -r line; do echo -e $BCyan$line tempoaudio=${line} echo -e $BRed"Durata del audio :"$BYellow$(bc <<<"$tempoaudio") done <$filea if [ "$tempoaudio" > "$tempovideo" ] then echo 'l audio e piu lungo del video di '$(bc <<< "$tempoaudio"-"$tempovideo" ) #quindi non si deve fare nulla e vale l'opzione -shortest #+viene aggiunto l'audio originale immesso ffmpeg -i complex.mp4 -i $commento -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" -c:v copy -ac 2 -shortest videosound.mp4 echo 'Il video con traccia sonora aggiunta e : videosound.mp4' else echo 'il video e piu lungo del audio di '$(bc <<<"$tempovideo"-"$tempoaudio") #si deve raddoppiare l'audio per usare l'opzione -shortest ffmpeg -i "concat:$commento|$commento" -c copy 'duplex'$commento echo "Il file audio troppo corto e stato raddoppiato nel file duplex"$commento commentomusicale='duplex'$commento #viene aggiunto il commento sonoro raddoppiato ffmpeg -i complex.mp4 -i $commentomusicale -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" -c:v copy -ac 2 -shortest videosound.mp4 echo 'Il video con traccia sonora aggiunta e : videosound.mp4' fi else #caso in cui non e stato inserito file audio echo 'Il video senza traccia sonora aggiunta e : complex.mp4' sonoro=1 break fi #penultimo passo: vostro logo sul video echo 'Se volete aggiungere un vostro logo sul video, immettere nome e percorso del vostro logo.png' read logo if [ "$logo" != "" ] then if [ $sonoro = 1 ] then ffmpeg -i complex.mp4 -i $logo -filter_complex "overlay=20:20" videosound0.mp4 else ffmpeg -i videosound.mp4 -i $logo -filter_complex "overlay=20:20" videosound0.mp4 fi else #non mette logo, si danno 2 casi: musica si(videosound.mp4) e musica no(complex.mp4) #+credo convenga rinominare mv complex.mp4 videosound0.mp4 break fi #Ultimo passo i sottotitoli echo 'Digitare il nome del file .srt per i sottotitoli. INVIO per non aggiungere titoli' read srt if [ "$srt" != "" ] then #trasformazione nel file .ass ffmpeg -i $srt videofinito.ass #aggiunta sottotitoli ffmpeg -i videosound0.mp4 -vf subtitles=videofinito.ass videofinito.mp4 echo 'Il tuo video completo di sottotitoli e videofinito.mp4' else if [ "$sonoro" = 1 ] then mv videosound.mp4 videofinito.mp4 echo 'Il tuo video senza sottotitoli e videofinito.mp4' fi echo 'Grazie per aver usato il mio programma!' fi exit 0