在网上搜了一圈,没有找到 类似【剪映】中两个视频拼接的时候叠化转场的效果,就这种:
那就自己动手实现一个吧
比如有两个视频,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文件】
个人觉得还是很像的
标签:10,moviepy,set,CompositeVideoClip,subclip,mp4,part2,叠化,转场 From: https://www.cnblogs.com/longzhankunlun/p/16973864.html