Voici un tutoriel pour assembler plusieurs vidéos sous la forme d'une mosaïque et enregistrer le résultat sous forme de vidéo. Pour ça, nous utiliserons avisynth pour réaliser le script de montage et ffmpeg pour créer la vidéo finale (deux logiciels libres). Pour l'installation de ces deux logiciels, voir les 2 billets : installation de ffmpeg et utiliser ffmpeg avec avisynth).



une mosaïque à 4 cases

Voila le script avisynth dans version la plus simple, les 4 vidéos sont assignées une par une, et les opérateurs StackHorizontal et StackVertical permettent de faire l'assemblage. On part du principe que ces vidéos sont muettes et ont les mêmes caractéristiques (dimensions, images par seconde). Les vidéos seront assemblées de gauche à droite et de haut en bas. Ce script est à coller dans un fichier texte avec l'extension ".avs"

clip1 = AviSource("video1.avi") 
clip2 = AviSource("video2.avi") 
clip3 = AviSource("video3.avi") 
clip4 = AviSource("video4.avi") 
clip5 = StackVertical(StackHorizontal(clip1,clip2),StackHorizontal(clip3,clip4)) 
return clip5
mosaique video à 4 cases

Image créée à partir du script avisynth avec la commande ffmpeg suivante :
ffmpeg -i mosaique4.avs -an -ss 00:00:00 -r 1 -vframes 1 -s 320×240 -f mjpeg -y mosaique4.jpg


une mosaïque à 9 cases

Sur le même principe on peut étendre le script avisynth pour réaliser une vidéo à 9 cases

# pour un copier coller, enlever les retours à la ligne de la ligne clip 10
clip1 = AviSource("video1.avi") 
clip2 = AviSource("video2.avi") 
clip3 = AviSource("video3.avi") 
clip4 = AviSource("video4.avi") 
clip5 = AviSource("video5.avi") 
clip6 = AviSource("video6.avi") 
clip7 = AviSource("video7.avi") 
clip8 = AviSource("video8.avi") 
clip9 = AviSource("video9.avi") 

clip10 = StackVertical(StackHorizontal(clip1,clip2,clip3),
   StackHorizontal(clip4,clip5,clip6),
   StackHorizontal(clip7,clip8,clip9)) 
return clip10

mosaique video à 9 cases



une mosaïque avec des cases de différentes tailles

Un peu plus corsé cette fois, une mosaïque avec plusieurs cases, des cases noires, et une bande son rajoutée à la fin! Voila à quoi devrait ressembler notre vidéo finale :

mosaique video

# fixer les dimensions de base d'une case
largeur = 320
hauteur = 240
duree = 200

# créer les clips et égaliser leur propriétés
clip1 = AVISource("video1.avi").KillAudio.BicubicResize(largeur*2,hauteur*2)
         .ChangeFPS(25).ConvertToYUY2().Trim(0,duree-1)
clip2 = AVISource("video2.avi").KillAudio.BicubicResize(largeur,hauteur)
          .ChangeFPS(25).ConvertToYUY2().Trim(0,duree-1)
clip3 = DirectShowSource("video3.avi").KillAudio.BicubicResize(largeur*2,hauteur*2)
          .ChangeFPS(25).ConvertToYUY2().Trim(100,duree-1)
clip4 = AVISource("video4.avi").KillAudio.BicubicResize(largeur*3,hauteur*3)
          .ChangeFPS(25).ConvertToYUY2().Trim(0,duree-1)

# créer une séquence noire
vide = BlankClip(width=largeur,height=hauteur,fps=25,length=duree-1,
         color=$000000).ConvertToYUY2()

# empiler!
clip5 = StackHorizontal(vide.BicubicResize(largeur,hauteur*2), clip1, 
          vide.BicubicResize(largeur,hauteur*2), StackVertical(vide,clip2))
clip6 = StackHorizontal(StackVertical(clip3,
          vide.BicubicResize(largeur*2,hauteur)),clip4)
clip7 = StackVertical(clip5,clip6)

# redimensionner
clip8 = clip7.BicubicResize(largeur,hauteur)

# rajouter une bande son
audio = WAVSource("osc.wav")
# on ne peut pas utiliser Trim sur du son
# donc on crée une vidéo fantoche
clip9 = AudioDub(vide,audio).Trim(0,duree-1)

clip10 = AudioDub(clip8,clip9)

return clip10

Script avisynth à télécharger (changer l'extension par .avs) : mosaique avisynth
Le nouveau fichier vidéo est créé en utilisant ffmpeg, avec la commande suivante :
ffmpeg -i mosaique3.avs -b 360k -f flv video.flv

Et voila le résultat (par elle même, la vidéo n'a aucun intérêt! C'est juste un montage réalisé à partir de séquences qui trainent sur mon disque dur!)