1. 程式人生 > 其它 >moviepy模擬視訊拼接疊化轉場效果

moviepy模擬視訊拼接疊化轉場效果

在網上搜了一圈,沒有找到 類似【剪映】中兩個視訊拼接的時候疊化轉場的效果,就這種:

那就自己動手實現一個吧

比如有兩個視訊,a.mp4 和 b.mp4 疊化轉場效果看起來就像a慢慢在消失,而b慢慢在顯現。而消失和顯現貌似可以調整透明度來實現,那我們來理一下視訊疊化轉場的思路:

1.將兩個視訊分成3個段落,

  part1 :a.mp4的前段

  part2 :a.mp4的後段 和 b.mp4的前段 重合的部分,也就是轉場的部分

  part3:b.mp4的後段

  整個段落看起來就應該是這樣

  

2. 將part2中a.mp4和b.mp4模擬疊化效果生成為一個視訊

  暫定轉場時長持續0.5s,把0.5s內的a.mp4分成10段,b.mp4也分成10段,然後:

a的第1段和b的第1段合成一個新段落,

a的第2段和b的第2段合成一個新段落,

a的第3段和b的第3段合成一個新段落,

...

a的第10段和b的第10段合成一個新段落,

在這個過程中,a.mp4的透明度逐漸降低,b.mp4的透明度不變。因為amoviepy的1.0.3版中,CompositeVideoClip(引數1,引數2),引數2在上層,引數1在下層,把引數2的透明度慢慢調低,可以讓引數2慢慢消失引數1慢慢浮現,形成疊化效果

CompositeVideoClip([b段, a段.set_opacity(0.55)]) #set_opacity(0.55)即把視訊透明度調成55%

3. 將part1, part2, part3 合成為一個視訊,輸出mp4檔案

思路理完了,接下來是程式碼實現了

from moviepy.editor import *
import ffmpy
import os

# 輸入 1.mp4 和 2.mp4,返回他們拼接的成品(帶疊化效果)
def diehua(file_1, file_2):
    
    clip_1 = VideoFileClip(file_1)
    clip_2 = VideoFileClip(file_2)
    # 將這兩個視訊分成3部分,第一部分為純 1.mp4 的部分,第二部分為 1.mp4 和 2.mp4 疊加的部分,第三部分為純 2.mp4 的部分
    magic_time = 0.5 #
設定疊化轉場時長 duration_video1 = clip_1.duration # 片段1時長 duration_video2 = clip_2.duration # 片段2時長 part1 = clip_1.subclip(0, duration_video1-magic_time) # 片段1擷取 part3 = clip_2.subclip(magic_time, duration_video2) # 片段2擷取 part2_1 = clip_1.subclip(duration_video1-magic_time, duration_video1) # 片段1的最後0.5秒 part2_2 = clip_2.subclip(0, magic_time) # 片段2的開始0.5秒 # 將第二部分(1.mp4和2.mp4疊加的部分)分成10份,每份時長儘量保持一致,超過10份會明顯示卡頓一下,未探究原因 part2_1_1 = part2_1.subclip(0,0.05) part2_1_2 = part2_1.subclip(0.05,0.1) part2_1_3 = part2_1.subclip(0.10,0.15) part2_1_4 = part2_1.subclip(0.15,0.2) part2_1_5 = part2_1.subclip(0.2,0.25) part2_1_6 = part2_1.subclip(0.25,0.3) part2_1_7 = part2_1.subclip(0.3,0.35) part2_1_8 = part2_1.subclip(0.35,0.4) part2_1_9 = part2_1.subclip(0.4,0.45) part2_1_10 = part2_1.subclip(0.45,0.5) part2_2_1 = part2_2.subclip(0,0.05) part2_2_2 = part2_2.subclip(0.05,0.1) part2_2_3 = part2_2.subclip(0.1,0.15) part2_2_4 = part2_2.subclip(0.15,0.2) part2_2_5 = part2_2.subclip(0.2,0.25) part2_2_6 = part2_2.subclip(0.25,0.3) part2_2_7 = part2_2.subclip(0.3,0.35) part2_2_8 = part2_2.subclip(0.35,0.4) part2_2_9 = part2_2.subclip(0.4,0.45) part2_2_10 = part2_2.subclip(0.45,0.5) # 將 part2_1 和 part2_2 疊加視訊合成 part2,2個部分通過控制不同時間不同透明度完成疊化效果 # 其中第二個引數處於上面一層,通過把前面的片段放在上面一層,再逐漸降低他的不透明度(就是讓前面的片段慢慢變透明),來讓下面一層的後面的片段慢慢浮現出來,產生片段疊加效果 F_part2_1 = CompositeVideoClip([part2_2_1, part2_1_1.set_opacity(0.95)]) F_part2_2 = CompositeVideoClip([part2_2_2, part2_1_2.set_opacity(0.85)]) F_part2_3 = CompositeVideoClip([part2_2_3, part2_1_3.set_opacity(0.75)]) F_part2_4 = CompositeVideoClip([part2_2_4, part2_1_4.set_opacity(0.65)]) F_part2_5 = CompositeVideoClip([part2_2_5, part2_1_5.set_opacity(0.55)]) F_part2_6 = CompositeVideoClip([part2_2_6, part2_1_6.set_opacity(0.45)]) F_part2_7 = CompositeVideoClip([part2_2_7, part2_1_7.set_opacity(0.35)]) F_part2_8 = CompositeVideoClip([part2_2_8, part2_1_8.set_opacity(0.25)]) F_part2_9 = CompositeVideoClip([part2_2_9, part2_1_9.set_opacity(0.15)]) F_part2_10 = CompositeVideoClip([part2_2_10, part2_1_10.set_opacity(0.05)]) # 拼接視訊片段 video1 = concatenate_videoclips([F_part2_1, F_part2_2, F_part2_3, F_part2_4, F_part2_5, F_part2_6, F_part2_7, F_part2_8, F_part2_9, F_part2_10]) # 拼接視訊片段 video2 = concatenate_videoclips([part1,video1,part3]) return video2 #video2.write_videofile('0.mp4')

這裡分成n段可以用少量程式碼實現,但我大腦放假了。就這樣,最後 write_videofile 輸出一個mp4檔案,我們來看看效果對比:

【moviepy生成的mp4檔案】

【剪映生成的mp4檔案】

個人覺得還是很像的