2017-07-14 3 views
0

moviepyでビデオスライドショーを作成しようとしていますが、スライド間のスライドアップの切り替えがあります。それらがImageClipsだけの場合は正常に動作するようになりますが、CompositeVideoClipを使用してイメージにテキストを追加すると、動作しなくなります。 1つのCompositeVideoClipと残りのImageClipsがあれば正常に動作しますが、1つ以上のCompositeVideoClipsがあれば、それは中断し始めます。Moviepy複数のCompositeVideoClipsでのトランジションの問題

これがmoviepyのバグかどうかわかりません。設定方法はわかりません。私は何が起こっているかを把握することができるかどうかを確認するために、いくつかの異なるものを試してみました

from moviepy.editor import * 

H = 720 
W = 1280 
SIZE = (W, H) 
HX = H + H * .10 # increase size 10% 
WX = W + W * .10 
bold_font = 'Liberation-Sans-Bold' 
plain_font = 'Liberation-Sans' 

def slide_out(clip, duration, height, counter): 
    def calc(t, counter, duration, h): 
     ts = t - (counter * duration) 
     val = min(-45, h*(duration-ts)) 
     return ('center', val) 
    return clip.set_pos(lambda t: calc(t, counter, duration, height)) 

def add_transition(clip_size, counter, clip): 
    # reverse the count to get slide number. 
    counter = clip_size - 1 - counter 
    return slide_out(clip.resize(height=HX, width=WX), 3, HX, counter) 

img_1 = ImageClip("/pics/1.jpg").set_duration(4).set_start(0).resize(height=H, width=W) # 3-8 
txt_1 = TextClip("title 1", font=bold_font, color='white', fontsize=64, interline=9).set_duration(2).set_start(1).set_pos(('right', 360)).crossfadein(.3) 
stxt_1 = TextClip("sub title 1", font=plain_font, color='white', fontsize=80, interline=9).set_duration(1.5).set_start(1.5).set_pos(('right', 440)).crossfadein(.3) 
img_2 = ImageClip("/pics/2.jpg").set_duration(4).set_start(3).resize(height=H, width=W) # 3-8 
txt_2 = TextClip("title 2", font=bold_font, color='white', fontsize=64, interline=9).set_duration(3).set_start(3.5).set_pos(('right', 360)).crossfadein(.3) 
stxt_2 = TextClip("sub title 2", font=plain_font, color='white', fontsize=80, interline=9).set_duration(2.5).set_start(3.5).set_pos(('right', 440)).crossfadein(.3) 

# slides images with text on top. 
slide_1 = CompositeVideoClip([img_1, txt_1, stxt_1]) #.set_duration(4) 
slide_2 = CompositeVideoClip([img_2, txt_2, stxt_2]) #.set_duration(4) 

clips = [slide_2, slide_1] # reverse because we want the first slides on top. 

slides = [add_transition(len(clips), x, clip) for x, clip in enumerate(clips)] 
final_clip = CompositeVideoClip(slides, size=SIZE).set_duration(8) 
final_clip.write_videofile("/pics/vids/video.mp4", fps=24, audio_codec="aac") 

は、ここに私のコードです。あなたが与えることができるどんな助けも素晴らしいでしょう。

オプション1

slide_1が持続セットとslide_2とfinal_clipを持っている場合は期間が設定されていない場合。完成ビデオの再生時間は4秒、合計再生時間は4秒です。完全な最初のスライドが表示され、2番目のスライドの最初の秒だけが表示されます。

slide_1 = CompositeVideoClip([img_1, txt_1, stxt_1]).set_duration(4) slide_2 = CompositeVideoClip([img_2, txt_2, stxt_2]) final_clip = CompositeVideoClip(slides, size=SIZE)

結果

1

オプション2

slide_1とslide_2は、期間を設定しますが、final_clipそれは8秒の長さ8の期間を持っていますが、ない場合は、 2番目の画像は1秒間だけ表示され(t = 3〜t = 4)、テキストが消えてテキストが残ります。

slide_1 = CompositeVideoClip([img_1, txt_1, stxt_1]) slide_2 = CompositeVideoClip([img_2, txt_2, stxt_2]) final_clip = CompositeVideoClip(slides, size=SIZE).set_duration(8)

結果

2

オプション3.

すべての3つは、設定期間を持っている場合。 slide_1はうまくいきますが、スライド2は1秒間しか表示されず、残りの時間は黒色になります。

slide_1 = CompositeVideoClip([img_1, txt_1, stxt_1]).set_duration(4) slide_2 = CompositeVideoClip([img_2, txt_2, stxt_2]).set_duration(4) final_clip = CompositeVideoClip(slides, size=SIZE).set_duration(8)

結果

3

オプション4.

それらのどれも設定期間を持っていない場合。 2.

slide_1 = CompositeVideoClip([img_1, txt_1, stxt_1]) slide_2 = CompositeVideoClip([img_2, txt_2, stxt_2]) final_clip = CompositeVideoClip(slides, size=SIZE)

結果

2

オプション5.

と同じスライド2は、期間を持っていますが、slide_1とfinal_clipはそうではない場合。 1と同じです。

slide_1 = CompositeVideoClip([img_1, txt_1, stxt_1]) slide_2 = CompositeVideoClip([img_2, txt_2, stxt_2]).set_duration(4) final_clip = CompositeVideoClip(slides, size=SIZE)

結果

1

答えて

0

、あなたはCompositeVideoClip

from moviepy.editor import * 
H = 720 
W = 1280 
SIZE = (W, H) 
HX = H + H * .10 # increase size 10% 
WX = W + W * .10 
bold_font = 'Liberation-Sans-Bold' 
plain_font = 'Liberation-Sans' 
img_1 = ImageClip("bbb.jpeg").set_duration(4).set_start(0).resize(height=H, width=W) # 3-8 
txt_1 = TextClip("title 1", font=bold_font, color='white', fontsize=64, interline=9).set_duration(2).set_start(1).set_pos(('right', 360)).crossfadein(.3) 
stxt_1 = TextClip("sub title 1", font=plain_font, color='white', fontsize=80, interline=9).set_duration(1.5).set_start(1.5).set_pos(('right', 440)).crossfadein(.3) 
img_2 = ImageClip("aaa.jpg").set_duration(8).set_start(4).resize(height=H, width=W) # 3-8 
# look the img_2's set_duration and set_start,the same as txt_2 and stxt_2 
txt_2 = TextClip("title 2", font=bold_font, color='white', fontsize=64, interline=9).set_duration(7).set_start(4.5).set_pos(('right', 360)).crossfadein(.3) 
stxt_2 = TextClip("sub title 2", font=plain_font, color='white', fontsize=80, interline=9).set_duration(6).set_start(5.5).set_pos(('right', 440)).crossfadein(.3) 

slide_1 = CompositeVideoClip([img_1, txt_1, stxt_1]).set_duration(4) 
slide_2 = CompositeVideoClip([img_2, txt_2, stxt_2]).set_duration(8) 

clips = [slide_2, slide_1] 
final_clip = CompositeVideoClip(clips, size=SIZE).set_duration(8) 
final_clip.write_videofile("video.mp4", fps=12, audio_codec="aac") 

の背後にあるメカニズムは、すべての奇妙な振る舞いは、コードによって原因がわかります、以下のコードをテストしてくださいin videopy.video.compositeVideoClip.py

 # compute duration 
    ends = [c.end for c in self.clips] 
    if not any([(e is None) for e in ends]): 
     self.duration = max(ends) 
     self.end = max(ends) 
+0

助けてくれてありがとう! –

関連する問題