2016-06-02 13 views
2

Ich möchte einen Clip auf eine bestimmte Größe zoomen, dann aufhören weiter Zoomen. Mit anderen Worten, der Clip hört auf, seine Größe nach dem Erreichen einer bestimmten Größe weiter zu erhöhen, und es ist besser, wenn der Clip von viel kleiner seiner Originalgröße zu einer größeren Version zoomt. Ich benutze Movepy-Modul. Mit dem folgenden Code kann ich progressiv einen Clip zoomen, aber es fällt mir schwer herauszufinden, wie man einen Clip von klein auf groß vergrößert und so einen animierten Effekt erzeugt. Jede Rückmeldung, die Sie zur Verfügung stellen, wird sehr geschätzt.MoviePy Zoom-Effekte müssen optimiert werden

import os 
from moviepy.editor import * 

screensize = (640,360) 

clip = (ImageClip(img) 
     .resize(height=screensize[1]*4) 
     .resize(lambda t : 1+0.02*t) 
     .set_position(('center', 'center')) 
     .set_duration(10) 
     ) 

Ich habe eine sehr harte Zeit, herauszufinden, wie eine Funktion zu schreiben, um einen Typ-Schreibeffekt mit moviepy des txtclip zu erstellen, Briefe innerhalb des Clips was bedeutet, wird nacheinander angezeigt werden, um eine glatte Art zu schaffen, -Wiedergabetext Moviepy bekam einige hilfreiche Klassen wie findObjects - die einzelnen Buchstaben aus einem Clip erkennen kann:

txtClip = TextClip('Cool effect',color='white', font="Amiri-Bold", 
        kerning = 5, fontsize=100) 
cvc = CompositeVideoClip([txtClip.set_pos('center')], 
         size=screensize, transparent=True) 

letters = findObjects(cvc) # a list of ImageClips 

here is the link: http://zulko.github.io/moviepy/examples/moving_letters.html 

nach den Buchstaben zu finden (Briefklammern) Ich möchte sie so verbinden, dass sie ein erscheinen nach ein anderes, das aussieht wie Schreiben.

Die Dokumentation enthält bereits einige Beispiele für bewegte Buchstaben, die jedoch sehr nützlich sein könnten. Danke

Antwort

2

Dies ist ein Weg zu erreichen, was Sie wollen. Der Schlüssel besteht darin, die Größenänderungslogik in einer benannten Funktion zu definieren, anstatt eine lambda zu verwenden.

import os 
from moviepy.editor import * 


def resize_func(t): 
    if t < 4: 
     return 1 + 0.2*t # Zoom-in. 
    elif 4 <= t <= 6: 
     return 1 + 0.2*4 # Stay. 
    else: # 6 < t 
     return 1 + 0.2*(duration-t) # Zoom-out. 

duration = 10 
screensize = (640,360) 

clip_img = (
    ImageClip('test.png') 
    .resize(screensize) 
    .resize(resize_func) 
    .set_position(('center', 'center')) 
    .set_duration(duration) 
    .set_fps(25) 
    ) 

clip = CompositeVideoClip([clip_img], size=screensize) 
clip.write_videofile('test.mp4') 

EDIT

Der Code, der Antworten den zweiten Teil Ihrer Frage (ich weiß nicht, ob es besser wäre, zwei getrennte Fragen zu machen) folgt.

from __future__ import division 
from moviepy.editor import * 
from moviepy.video.tools.segmenting import findObjects 


def clip_typewriter(text, duration_clip, duration_effect): 
    # `duration_effect` is effectively the time where the last letter appears. 
    clip_text = TextClip(
        text, 
        color='white', 
        font='Consolas', 
        fontsize=80, 
        kerning=3, 
        ) 
    letters = findObjects(clip_text, preview=False) 
    # Select the start time in seconds for each letter found: 
    n = len(letters) 
    times_start = [duration_effect*i/(n-1) for i in range(n)] 
    clips_letters = [] 
    for i, letter in enumerate(letters): 
     clips_letters.append(letter 
      .set_position(letter.screenpos) 
      .set_start(times_start[i]) 
      .set_end(duration_clip) 
      # Here you can add key sounds using `set_audio`. 
      ) 
    return CompositeVideoClip(clips_letters, size=clip_text.size) 


if __name__ == '__main__': 
    screensize = (320, 180) 
    fps = 12 
    clip_1 = clip_typewriter('hello', 2, 1).set_start(1).set_position('center') 
    clip_2 = clip_typewriter('world', 2, 1).set_start(4).set_position('center') 
    clip_final = CompositeVideoClip([clip_1, clip_2], size=screensize) 
    clip_final.write_gif('test_typewriter.gif', fps=fps) 

Ergebnis:

enter image description here

+0

Dank für Ihren Code. Es funktioniert wie erwartet; Ich habe nur ein weiteres Problem mit MoviePy. Kann ich es dich wissen lassen? –

+0

Ja, natürlich! – feqwix

+0

Ich habe meinen Beitrag mit einem anderen Problem aktualisiert. Du kannst es anschauen. Vielen Dank. –