BASH concatenation de fichier vidéo

Tags: #<Tag:0x00007f63f2be04a8>

Hello les debianais,

J’aimerais vous faire part d’un petit souci que je n’arrive pas à résoudre.
J’aimerais concaténer des fichiers vidéos, avec un script BASH.
Le seul soucis, est que je me retrouve avec un écran noir un fois la 1er vidéo passée.
si 1.mp3 2.mp3 3.mp3, la concaténation fonctionne avec mon fichier en sortie, mais seul la vidéos 1 à l’image et le son , après je n’ai que le son.

Ca me rend dingue, ça fait des heures que je cherche ou est le problème.

Je ne vous donne pas le code complet du script, ça sert pas vraiment a grand chose temps que je n’arrive pas a faire fonctionner le principale qui est la concaténation.

ffmpeg -f concat -safe 0 -i <(for file in ./*.mp4; do echo "file '$PWD/$file'"; done) -c copy test.6.mp4

Si vous pouviez tester avec deux fichier MP4 ce que ca donne chez vous.

Hello,
Bon finalement après de longues heures de recherche, j’ai fini par trouver que le souci venait de l’aspect_ratio qui était différent le (SAR et le DAR).

j’ai enfin terminé mon script, qui fonctionne correctement pour moi bien sur.
Je vous post ici, car je pense que ca pourra aider au besoin, ma fonction de concaténation qui vérifié justement que les fichiers qui doivent être concaténer, ont bien le bon ratio entre eux.

function concatenate(){	
#Initialisation des tableaux
	array=()
	arraysar=()
	arraydar=()
#Boucle pour avoir tous les fichiers videos mp4 du repertoire courant dans un tableau et récupération des données videos SAR DAR
for file in *.mp4
do
	array+=("-i $file")
	local sar=$(ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -select_streams v:0 -show_streams "$file" | grep sample_aspect_ratio | cut -d'=' -f2 | sed 's/://g')
	local dar=$(ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -select_streams v:0 -show_streams "$file" | grep display_aspect_ratio | cut -d'=' -f2 | sed 's/://g')
	arraysar+=("$sar")
	arraydar+=("$dar")
done

echo -e "Verify if videos : ${array[*]} can be concat"

					SAR=($(printf "%s\n" "${arraysar[@]}" | sort -u))
					DAR=($(printf "%s\n" "${arraydar[@]}" | sort -u))

				if 	(( ${#SAR[@]} > 1 || ${#DAR[@]} > 1 )); then
				        echo -e "\nFiles can't be concatened because don't have same ASPECT_RATIO"
					return 1
	       		
				else
					echo -e "\nFiles can be concatened ..... please....wait until that's finish\n"
					read -p "Choose output file name of concatened files whitout extension : => " reply
 	       				ffmpeg `echo ${array[@]}` -vsync 2 -filter_complex "[0:v][0:a][1:v][1:a] concat=n=2:v=1:a=1 [outv] [outa]" -map "[outv]" -map "[outa]" ${reply%.*}.mp4 &>/dev/null
				fi
}

Mon sujet est résolu

Intéressant.
Cela dit, pour l’interface j’aurais préféré « concatenate », « concatenated » et « finished ».
Mais je chipote beaucoup :yum:

En fait la je t’ai donner juste une seul fonction mais le script est très long, c’est un peu la boite a outils que j’utilise pour mes conception web.
Je donne la version un peu reviser surtout pour l’aspect des videos qui peut creer des erreurs sur certaines.
J’ai ajouté aussi les videos Webm que j’utilise de plus en plus.

function concatenate(){	
#Initialisation des tableaux
	array=()
	arraysar=()
	arraydar=()
	aspect_resolution=()

#Boucle pour avoir tous les fichiers videos mp4 du repertoire courant dans un tableau et récupération des données videos SAR DAR
read -r -p "Which type of file want concatened only MP4 & WEBM supported (mp4|webm) : => " video_type
echo ""
if [[ "$video_type" == "mp4" ]];then
	pattern='*.mp4'
elif [[ "$video_type" == "webm" ]];then
	pattern='*.webm'
fi

for file in $pattern
do
	array+=("-i $file")
	dar="$(ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -select_streams v:0 -show_streams "$file" | grep display_aspect_ratio | cut -d'=' -f2 | sed 's/://g')"
	aspect_resolution+=($(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$file"))
	arraydar+=("$dar")
done
echo ""
echo -e "Verify if videos : ${array[*]/-i/} can be concat"

				read -r -a DAR <<<$(printf "%s\n" ${arraydar[@]} | sort -u)
				read -r -a ASPECT <<<$(printf "%s\n" ${aspect_resolution[@]} | sort -u)

				if 	(( ${#DAR[@]} > 1 || ${#ASPECT[@]} > 1 ));then
				        echo -e "\nFiles can't be concatened because don't have same ASPECT_RATIO and RESOLUTION"
						echo -e "Try to download video with the same RATIO for concat\nIf you use this script for download he doing for you"

				else
					echo -e "\nFiles can be concatened ..... please....wait until that's finish\n"
					read -r -p "Choose output file name of concatened files whitout extension : => " reply
					echo "... Processing ... ${array[*]/-i/}"
						if [[ "$pattern" =~ mp4$ ]];then
 	       				ffmpeg ${array[*]} -vsync 2 -filter_complex "[0:v]scale=-1:576:force_original_aspect_ratio=1[v0]; [1:v]scale=-1:576:force_original_aspect_ratio=1[v1]; [v0][0:a][v1][1:a]concat=n=2:v=1:a=1[v][a]" -map [v] -map [a] "${reply}".mp4 && echo -e "\nYour File "${reply}".mp4 has been created with success ......"
						elif [[ "$pattern" =~ webm$ ]];then
						ffmpeg -f concat -safe 0 -i <(for f in ${array[*]/-i/}; do echo "file '$PWD/$f'"; done) -c copy "${reply}".webm  && echo -e "\nYour File "${reply}".webm has been created with success ......"
						fi
				fi
}