Concaténation de vidéos VSE / Blender

, par MiKaël Navarro

Un exemple de script Python pour le chargement et la concaténation de vidéos dans le VSE de Blender :

# Concat videos
import os
import glob
import bpy

# Convenience variables
C = bpy.context
SCENE = bpy.context.scene
OPS = bpy.ops
D = bpy.data
data = bpy.data.scenes

# Create new Scene
myscene = bpy.data.scenes.new('myscene')
myscene.sequence_editor_create()

# Global variables
vid_cnt = 0
channel = 1
overlap = 60
last_frame = overlap + 1  # frame counter

# Add images
#for img in ["./vlcsnap-1.png", "./vlcsnap-2.png", "./vlcsnap-3.png"]:
#    myimage = myscene.sequence_editor.sequences.new_image(name='img', filepath=img, channel=1, frame_start=last_frame)
#    myimage.frame_final_duration = 5
#    last_frame = myimage.frame_final_end

# Add movies
myscene.sync_mode = 'AUDIO_SYNC'
for vid in glob.glob("./*.mp4"):
   vid_cnt += 1
   channel = (vid_cnt % 2) * 2 + 1
   myclip = myscene.sequence_editor.sequences.new_movie(name='clip', filepath=vid, channel=channel, frame_start=last_frame-overlap)
   mysound = myscene.sequence_editor.sequences.new_sound(name='sound', filepath=vid, channel=channel+1, frame_start=last_frame-overlap)
   mysound.frame_final_end = myclip.frame_final_end
   prev_frame = myclip.frame_final_start
   last_frame = myclip.frame_final_end

   if overlap > 0 and vid_cnt >= 2:
       # Add cross effect
       myeffect = myscene.sequence_editor.sequences.new_effect(name='effect', type='CROSS', channel=5, frame_start=prev_frame, frame_end=prev_frame+overlap, seq1=prevclip, seq2=myclip)
   
   prevclip = myclip

à exécuter via Alt-p

Ceci créera une nouvelle scène myscene dans laquelle sera chargé à la file toutes les vidéos MP4 trouvées dans le répertoire courant.

Pour paramétrer / lancer le rendu final, rajouter :

# Render attributes
resx = 1280; #640
resy = 720; #480
myscene.render.resolution_x = resx
myscene.render.resolution_y = resy
myscene.render.resolution_percentage = 100
#myscene.render.fps = 29.97
myscene.frame_end = last_frame
if getattr(bpy.app.build_options, 'codec_ffmpeg'):
   myscene.render.image_settings.file_format = 'FFMPEG'
   myscene.render.ffmpeg.format = 'MPEG4'
   myscene.render.ffmpeg.codec = 'MPEG4'
   myscene.render.ffmpeg.audio_codec = 'AAC'
   myscene.render.filepath = "./vid-"
else:
   myscene.render.image_settings.file_format = 'AVI_JPEG'
   myscene.render.filepath = "./vid.avi"

# Render
#bpy.ops.render.render(animation=True, scene="myscene")