在网上搜了一圈,没有找到 类似【剪映】中两个视频拼接的时候叠化转场的效果,就这种:

 

 

那就自己动手实现一个吧

比如有两个视频,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文件】

 

个人觉得还是很像的

 

posted on 2022-12-11 16:36  longzhankunlun  阅读(1581)  评论(1编辑  收藏  举报