2017-07-14 50 views
0

我正嘗試使用幻燈片之間的幻燈片向上轉換創建帶有影片的視頻幻燈片。如果他們只是ImageClips,我可以使轉換工作正常,但是當我使用CompositeVideoClip向圖像添加文本時,它將停止工作。如果我只有一個CompositeVideoClip,其餘的ImageClips可以正常工作,但是一旦我有多個CompositeVideoClips,它就會開始中斷。使用多個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.它將顯示完整的第一張幻燈片,並且僅顯示第二張幻燈片的第一秒。

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秒長,但第二張圖片只顯示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

如果三者有設定的持續時間。 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") 

所有怪異的行爲背後的機制是原因的代碼在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

感謝您的幫助! –