How to concatenate videos in moviepy?

animation, concatenation, moviepy, python

Solution

To be written to a file, all the frames must have the same size. Here you frames with Dog are smaller that the frames with CatCat, which spoils the video. A first solution is to use the method "compose" in concatenate_videoclips, this will give the same size to all clips:

import moviepy.editor as mp
messages = ["Dog", "Cat", "Duck", "Wolf"]
clips = [ mp.TextClip(txt, fontsize=170, color='green').set_duration(1)
          for txt in messages ]
concat_clip = mp.concatenate_videoclips(clips, method="compose")
concat_clip.write_videofile("texts.mp4")

A second solution is to give the same size (width, height) to all of your text clips:

import moviepy.editor as mp
messages = ["Dog", "Cat", "Duck", "Wolf"]
clips = [ mp.TextClip(txt, fontsize=170, color='green', size=(500,300))
            .set_duration(1)
          for txt in  messages]
concat_clip = mp.concatenate_videoclips(clips)
concat_clip.write_videofile("texts.mp4")

Problem

I am trying to use moviepy to generate video with texts. First, I want to show one messages and then another one. In my case I want to show "Dog" for one second and than "Cat Cat". For that I use the following code: from moviepy.editor import * ``` def my_func(messeges): clips = {} count = 0 for messege in messeges: count += 1 clips[count] = TextClip(messege, fontsize=270, color='green') clips[count] = clips[count].set_pos('center').set_duration(1) clips[count].write_videofile(str(count) + '.avi', fps=24, codec='mpeg4') videos = [clips[i+1] for i in range(count)] video = concatenate(videos) video.write_videofile('test.avi', fps=24, codec='mpeg4') video = VideoFileClip('test.avi') video.write_gif('test.gif', fps=24) if __name__ == '__main__': ms = [] ms += ['Dog'] ms += ['Cat Cat'] my_func(ms) ``` This is the result that I get: Does anybody know why do I have problems with cats?

Original source