#!/bin/bash #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 $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 Digitare INVIO per NON aggiungere commento musicale.' read commento # #penultimo passo: vostro logo sul video echo 'Se volete aggiungere un vostro logo sul video, immettere nome e percorso del vostro logo.png, altrimenti digitare INVIO.' read logo #----------------- #Ultimo passo i sottotitoli echo 'Digitare il nome del file .srt per i sottotitoli. INVIO per non aggiungere titoli' read srt #fine spostamento domande all'inizio 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 1) #stringa='[0:v:0][0:a:0][outv][outa]' mv $nuovo complex.mp4 #un solo video deve venir rinominato ;; 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 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 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 #mv complex.mp4 videosound.mp4 #echo 'Il video senza traccia sonora aggiunta e : videosound.mp4' 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 logo=1 if [ $sonoro = 1 ] then ffmpeg -i complex.mp4 -i $logo -filter_complex "overlay=1140:20" videosound0.mp4 #spostato il logo a dx prima era 20:20 perché su sharktube ho logo con faccia a sn else ffmpeg -i videosound.mp4 -i $logo -filter_complex "overlay=1140:20" videosound0.mp4 fi else #non mette logo, si danno 2 casi: musica si(videosound.mp4) e musica no(complex.mp4) #+credo convenga rinominare if [ "$logo" != "1" ] then mv complex.mp4 videosound0.mp4 fi 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 -e $Bred'Il tuo video completo di sottotitoli è videofinito.mp4'$BWhite else # if [ "$sonoro" = 1 ] # then mv videosound0.mp4 videofinito.mp4 echo -e $Bred'Il tuo video senza sottotitoli e videofinito.mp4' #fi echo 'Grazie per aver usato il mio programma!' fi exit 0