zoukankan      html  css  js  c++  java
  • moviepy音视频剪辑:使用concatenate_videoclips和clips_array将多个视频合成一个顺序播放或同屏播放的视频

    一、视频合成概述

    视频合成,也称为非线性编辑,实际上是在一个新剪辑中播放几个剪辑。

    请注意视频剪辑通常带有音频和遮罩,它们也是剪辑。当您将这些剪辑组合在一起时,通过将剪辑的原声和遮罩组合在一起,将自动生成最终剪辑的原声和遮罩。所以大多数时候你不需要担心混音和面具。

    两种简单的剪辑合成方法是将它们拼接起来(在一个长剪辑中一个接一个地播放它们)或将它们堆叠起来(在一个大剪辑中并排播放)。

    二、视频的拼接

    2.1、拼接方法和语法

    视频的拼接使用方法concatenate_videoclips,调用语法:

    concatenate_videoclips(clips, method="chain", transition=None, bg_color=None, ismask=False, padding = 0)
    
    语法释义:
    • clips:多个视频剪辑的列表,列表中的每个元素都是VideoClip类型的对象
    • method:拼接方法,有2种取值
    1. “chain”:生成一个简单输出多个剪辑连续帧的剪辑,不论这些剪辑是否相同大小(分辨率)都不进行修正。如果参数列表中的剪辑都没有遮罩,则最终拼接的剪辑也没有遮罩,否则最终剪辑的遮罩就是所有参数剪辑遮罩的拼接,如果对应参数指定剪辑没有遮罩则使用完全不透明的剪辑作为遮罩。如果参数对应的多个剪辑有不同大小又想将拼接剪辑直接输出到文件,需要使用“compose”方法
    2. “compose”:如果参数对应的剪辑不具有相同分辨率,最终分辨率将是使所有剪辑都不必调整大小的分辨率。因此,最终剪辑具有参数列表中最高剪辑的高度和最宽剪辑的宽度。所有尺寸较小的剪辑将显示为居中。如果mask=True,则边界为透明,否则为由“bg-color”指定的颜色。所有输入剪辑的最高FPS为最终连接剪辑的FPS
    • transition: transition指定一个将在列表的每两个剪辑之间播放的剪辑 ,即结果剪辑不但会将参数对应剪辑拼接,而且会在两个剪辑拼接中间插入一个由transition指定的过场剪辑
    • bg_color:仅在method="compose"时使用,设置背景色,如果要一个透明剪辑,则设置为None,否则为一个代表RGB颜色的三元组,如(0,0,0)代表黑色,也即透明色
    • padding:仅在method=“compose"时使用,两个连续剪辑间的间隔时间,注意如果该参数为赋值,后面的剪辑和前一剪辑的播放有一段时间重叠,这种负数的padding参数,会制造出后一个剪辑逐渐变暗退出的效果。一个非0的padding值会自动将method置为"compose”
    • 返回值:最终拼接的剪辑

    2.2、案例

    fileList = ['F:\video\1.mp4', 'F:\video\2.mp4','F:\video\3.mp4']
    tmpClip = []
    for fileName in fileList:
        print(f"准备加载视频文件:{fileName} ")
        clip = mpe.VideoFileClip(fileName)
        print(f"加载视频文件:{fileName} 完成,时长为{clip.duration}秒 ")
        tmpClip.append(clip)
        print(f"视频文件:{fileName} 已经加载并缓存")
    
    print("进行内存视频拼接...")
    destClip = mpe.concatenate_videoclips(tmpClip)
    print("内存视频拼接完成,准备输出到文件.")
    destClip.write_videofile("F:\video\dest.mp4")
    print("输出到文成功!")
    
    

    三、视频的堆叠(同屏显示)

    3.1、语法

    视频的堆叠使用了的clips_array函数,调用语法如下:

    clips_array(array, rows_widths=None, cols_widths=None, bg_color = None)
    
    参数说明:
    • array:用于存放剪辑的二维列表,每个列表的元素都是一个列表,每个元素的列表代表在屏幕上同行显示的多个剪辑,一维列表中有多少个元素就表示在屏幕上显示多少行,每行视频有多个视频并列。
    • rows_widths:不同行的像素宽度,如果设置为None则自动设置
    • cols_widths:不同列的像素宽度,如果设置为None则自动设置
    • bg_color:为蒙版和未蒙版区域填充颜色。这些设置为None,这些区域将透明,处理速度会慢一些
    • 返回值:合成后的剪辑

    3.2、样例

    print(f"视频将排列成{lines}行{columns}列")
    clipArrays = []
    tmpClipArray = []
    column = 0
    for clip in tmpClip:
        tmpClipArray.append(clip)
        column += 1
        if column == columns:
            clipArrays.append(tmpClipArray)
            column = 0
            tmpClipArray = []
    destClip = mpe.clips_array(clipArrays)
    

    更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。

    关于收费专栏

    老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。

    收费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》,本文收费专栏对应文章为《moviepy音视频剪辑:多个视频合成一个视频》。

    对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

    如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

    跟老猿学Python、学5G!

  • 相关阅读:
    对TCP/IP协议的一些看法(12):UDP协议
    对TCP/IP协议的一些看法(11):窗口
    对TCP/IP协议的一些看法(10):TCP协议(2)
    对TCP/IP协议的一些看法(9):TCP协议(1)
    对TCP/IP协议的一些看法(8):DNS协议
    对TCP/IP协议的一些看法(7):传输层
    [BFS]翻币问题
    [BFS]骑士旅行
    [BFS]电子老鼠闯迷宫
    [BFS]P1434 [SHOI2002]滑雪
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643520.html
Copyright © 2011-2022 走看看