ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-06-14 11:33:05  阅读:161  来源: 互联网

标签:10 moviepy Python 剪辑 60 int timeTuple startTimeSendStr


使用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有