编程语言
首页 > 编程语言> > 使用Python的moviepy第三方库剪辑视频

使用Python的moviepy第三方库剪辑视频

作者:互联网

使用Python的moviepy第三方库剪辑视频


前言

使用moviepy库按照指定格式进行剪辑视频。


一、使用环境

  1. win10
  2. python==3.7.2
  3. moviepy==1.0.3

二、使用步骤

1.安装moviepy

参考官方文档

2.引入库

from moviepy.editor import VideoFileClip
import os, re

3.完整代码

from moviepy.editor import VideoFileClip
import os, re


def Clip_Video(videoFilePath: str, videoTimeStr: str, videoSavePath: str) -> bool or str:
    """
    1、剪辑视频

    2、10:10-20:20(输出这个区间的视频)

    3、10:10>(此时间直到结尾)

    4、<20:20(开头直到此时间)

    :param videoFilePath: 源视频文件路径
    :param videoTimeStr: 剪辑时间格式
    :param videoSavePath: 剪辑好的视频保存文件路径
    :return:
    """

    # 读取视频
    video = VideoFileClip(videoFilePath)

    # 开始时间 结束时间
    startTimeSendStr, endTimeSendStr = '', ''
    # 10:10-20:20(输出这个区间的视频)
    if '-' in videoTimeStr:
        # 分离开始时间和结束时间
        timeTuple = re.findall('(.*)-(.*)', videoTimeStr)[0]
        # 遍历每个时间
        for j in timeTuple:
            # 获取时与分
            timeTuple_ = re.findall('(.*):(.*)', j)[0]

            # 1小时以下
            if len(timeTuple_) >= 2 < 3:
                if startTimeSendStr == '':
                    # 开始的秒
                    startTimeSendStr = int(timeTuple_[0]) * 60 + int(timeTuple_[1])
                else:
                    # 结束的秒
                    endTimeSendStr = int(timeTuple_[0]) * 60 + int(timeTuple_[1])
            # 1小时以上
            elif len(timeTuple_) >= 3:
                if startTimeSendStr == '':
                    # 开始的秒
                    startTimeSendStr = int(timeTuple_[0]) * 60 * 60 + int(timeTuple_[1]) * 60 + int(timeTuple_[2])
                else:
                    # 结束的秒
                    endTimeSendStr = int(timeTuple_[0]) * 60 * 60 + int(timeTuple_[1]) * 60 + int(timeTuple_[2])
            else:
                return '时间错误'

    # 10:10>(此时间直到结尾)
    elif '>' in videoTimeStr:
        # 获取时与分
        timeTuple_ = re.findall('(.*):(.*)', re.sub('>', '', videoTimeStr))[0]

        # 1小时以下
        if len(timeTuple_) >= 2 < 3:
            # 开始的秒
            startTimeSendStr = int(timeTuple_[0]) * 60 + int(timeTuple_[1])
        # 1小时以上
        elif len(timeTuple_) >= 3:
            # 开始的秒
            startTimeSendStr = int(timeTuple_[0]) * 60 * 60 + int(timeTuple_[1]) * 60 + int(timeTuple_[2])
        else:
            return '时间错误'

        # 结束的秒等于视频结束时间
        endTimeSendStr = int(video.end)

    # <20:20(开头直到此时间)
    elif '<' in videoTimeStr:
        # 获取时与分
        timeTuple_ = re.findall('(.*):(.*)', re.sub('<', '', videoTimeStr))[0]

        if len(timeTuple_) >= 2 < 3:
            # 结束的秒
            endTimeSendStr = int(timeTuple_[0]) * 60 + int(timeTuple_[1])
        elif len(timeTuple_) >= 3:
            # 结束的秒
            endTimeSendStr = int(timeTuple_[0]) * 60 * 60 + int(timeTuple_[1]) * 60 + int(timeTuple_[2])
        else:
            return '时间错误'

        # 开始的秒等于视频开始时间
        startTimeSendStr = int(video.start)

    else:
        return '输入的时间格式不正确 -> 参考:10:10-20:20 or 10:10> or <20:20'

    # 剪辑
    if startTimeSendStr != '' and endTimeSendStr != '':
        # 剪辑
        video_ = video.subclip(startTimeSendStr, endTimeSendStr)
        # 保存
        if os.path.isdir(videoSavePath):
            video_.write_videofile(
                fr'{videoSavePath}\{str(os.path.split(video.filename)[1])}', threads=16, fps=int(video_.fps)
            )
        elif os.path.isfile(videoSavePath):
            video_.write_videofile(
                videoSavePath, threads=16
            )
        else:
            return '视频保存路径不正确'

    return True


if __name__ == '__main__':
     Clip_Video(
        videoFilePath=r'C:\Users\Adminitrator\Desktop\视频1.mp4',
        videoTimeStr='2:10-3:10', videoSavePath=r'C:\Users\Adminitrator\Desktop'
    )
    pass

三、错误处理

  1. TypeError: must be real number, not NoneType

TypeError: must be real number, not NoneType

原因:moviepy要求decorator<5.0,>=4.0.2
处理方法:安装指定版本的decorator或者替换

标签:10,moviepy,Python,剪辑,60,int,timeTuple,startTimeSendStr
来源: https://www.cnblogs.com/nightSkyFZ/p/16373972.html