7

クリップを特定のサイズにズームしてから、それ以上のズームを停止したいと考えています。言い換えれば、クリップは特定のサイズに達するとそれ以上のサイズの拡大を停止し、クリップが元のサイズよりもはるかに小さいサイズからより大きなバージョンにズームし始めると、より良い結果が得られます。moviepy モジュールを使用しています。次のコードを使用すると、クリップを段階的にズームできますが、クリップを小さなものから大きなものに拡大してアニメーション効果を作成する方法を理解するのに苦労しています。あなたが提供するフィードバックは大歓迎です。

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

moviepy の txtclip を使用してタイプ書き込み効果を作成する関数を作成する方法を理解するのに非常に苦労しています。つまり、クリップ内の文字が次々に表示され、スムーズなタイプライター アニメーション テキストが作成されます。Moviepy には、クリップから個々の文字を検出できる findObjects などの便利なクラスがいくつかあります。

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

文字(レタークリップ)を見つけたら、タイプライティングのように次々と現れるように結合したいと思います。

ドキュメントには、移動文字の例がいくつかありますが、これは非常に役立つかもしれません。ありがとうございました

4

1 に答える 1

10

これは、あなたが望むものを達成する方法です。重要なのは、 を使用する代わりに、名前付き関数でサイズ変更ロジックを定義することlambdaです。

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

編集

次のコードは、質問の 2 番目の部分に回答します (2 つの別々の質問を作成する方がよいかどうかはわかりません)。

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)

結果:

ここに画像の説明を入力

于 2016-06-02T21:05:59.417 に答える