2015-02-27 4 views
10

Sto cercando di utilizzare MoviePy per generare video con testi. Per prima cosa, voglio mostrare un messaggio e poi un altro. Nel mio caso voglio mostrare "Dog" per un secondo e poi "Cat Cat". Per questo io uso il seguente codice:Come concatenare i video in MoviePy?

da 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) 

questo è il risultato che ottengo:

enter image description here

Qualcuno sa perché ho dei problemi con i gatti?

risposta

12

Per essere scritti su un file, tutti i frame devono avere le stesse dimensioni. Qui i frame con Dog sono più piccoli dei frame con CatCat, che rovina il video. Una prima soluzione è quella di utilizzare il metodo del "comporre" in concatenate_videoclips, questo darà la stessa dimensione per tutti i clip:

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") 

Una seconda soluzione è quello di dare la stessa dimensione (larghezza, altezza) per tutto il testo clip:

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")