首页 > 编程语言 >python根据达芬奇场景分析保存的edl文件,智能裁切输出4K视频画面(不带声音)-自动找到MP4对应的EDL文件并移动到指定目录下对应的秒数文件夹下-只处理大于5帧的剪切点的画面-批量处理一个文件

python根据达芬奇场景分析保存的edl文件,智能裁切输出4K视频画面(不带声音)-自动找到MP4对应的EDL文件并移动到指定目录下对应的秒数文件夹下-只处理大于5帧的剪切点的画面-批量处理一个文件

时间:2024-03-29 17:34:54浏览次数:21  
标签:文件 str list MP4 文件夹 shifenmiao file print path

使用前先将mp4对应的EDL文件命名为相同的名字,如:春天.mp4, 春天.edl

只处理持续时间大于5帧的画面

批量处理指定文件夹下所有文件,处理失败的直接跳过,接着继续处理其他的

 

import cv2
import os
import time
import datetime
import shutil
from moviepy.editor import VideoFileClip



#读取切分文件
def readQiFenWenJian(filename):
    with open(filename, "r", encoding='UTF-8')as f:
        res_list = f.readlines()
        print("读取到的切分文件")

        print(res_list)
        print(len(res_list))
    zuizhong_res_list = []
    for i in range(2,len(res_list)):
        if res_list[i] != '\n':
            zuizhong_res_list.append(res_list[i])

    print(zuizhong_res_list)
    print(len(zuizhong_res_list))
    return zuizhong_res_list



# 读取一个视频文件,从帧列表中,开始算后续帧,第一个帧尾为0
def handleOneVideo(video_file,zhen_list):
    #获取当前时间
    nowtime = time.strftime('%Y%m%d%H%M%S', time.localtime())
    #创建视频文件目录
    xinjianmulu = str(video_file).replace(".mp4","")
    createDir(file_dir=xinjianmulu)

    for i in range(0, len(zhen_list)):
        print("进入for循环")
        yihang_shifenmiao = []
        yihangshuju = zhen_list[i]
        print("一行数据:")
        print(yihangshuju)
        yihang_list = yihangshuju.split(" ")
        print("yihang列表:")
        print(yihang_list)
        for one in yihang_list:
            if ":" in one:
                yihang_shifenmiao.append(one)

        print("yihang时分秒帧-列表:")
        print(yihang_shifenmiao)
        start_shifenmiao = yihang_shifenmiao[0]
        start_shifenmiao_list = start_shifenmiao.split(":")
        print("start_shifenmiao_list:")
        print(start_shifenmiao_list)

        end_shifenmiao = yihang_shifenmiao[1]
        end_shifenmiao_list = end_shifenmiao.split(":")
        print("end_shifenmiao_list:")
        print(end_shifenmiao_list)


        START_HOUR = int(start_shifenmiao_list[0])  # 开始小时
        START_MIN = int(start_shifenmiao_list[1])  # 开始分钟
        START_SECOND = int(start_shifenmiao_list[2])  # 开始秒数
        START_TIME = START_HOUR * 3600 + START_MIN * 60 + START_SECOND  # 设置开始时间(单位秒)
        END_HOUR = int(end_shifenmiao_list[0])  # 结束小时
        END_MIN = int(end_shifenmiao_list[1])  # 结束分钟
        END_SECOND = int(end_shifenmiao_list[2])   # 结束秒
        END_TIME = END_HOUR * 3600 + END_MIN * 60 + END_SECOND  # 设置结束时间(单位秒)

        video = video_file
        cap = cv2.VideoCapture(video)  # 读取视频
        FPS = cap.get(cv2.CAP_PROP_FPS)
        print("帧率:")
        print(FPS)

        size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
        print("大小:")
        print(size)

        TOTAL_FRAME = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 获取视频总帧数
        print("总帧数:")
        print(TOTAL_FRAME)
        frameToStart = START_TIME * FPS+int(start_shifenmiao_list[3])  # 开始帧 = 开始时间*帧率 + 多余帧   根据达芬奇切割点自动算出开始帧
        print("开始帧:")
        print(frameToStart)
        frametoStop = END_TIME * FPS + int(end_shifenmiao_list[3])  # 结束帧 = 结束时间*帧率 + 多余帧 根据达芬奇切割点自动算出开始帧
        print("结束帧:")
        print(frametoStop)
        cishu = i
        zhenchazhi = int(frametoStop-frameToStart)
        #如果结束帧和开始帧相差大于5帧才进行处理
        if zhenchazhi>=5:

            xierushipin = r'%s_%s.mp4' % (video, cishu)
            print("开始写入%s文件"%xierushipin)
            # 分批写入视频文件
            videoWriter = cv2.VideoWriter(
                xierushipin, cv2.VideoWriter_fourcc(*'mp4v'), FPS, size)

            cap.set(cv2.CAP_PROP_POS_FRAMES, frameToStart)  # 设置读取的位置,从第几帧开始读取视频
            #如果是第0帧,则写入,如果不是从第0帧开始的,就往后推移一帧
            # if frameToStart==0:
            #     COUNT = frameToStart
            # else:
            #     COUNT = frameToStart + 1,

            COUNT = frameToStart
            chushi = COUNT
            #定义个全局变量
            global biaozhishuzhi
            biaozhishuzhi=True
            while biaozhishuzhi:
                print("进入while循环")
                success, frame = cap.read()
                if success:
                    COUNT += 1
                    if COUNT <= frametoStop and COUNT > frameToStart:  # 选取起始帧
                        print('correct= ', COUNT)
                        videoWriter.write(frame)
                # print('mistake= ', COUNT)
                if COUNT > frametoStop:
                    break
                if i+2 >len(zhen_list):
                    biaozhishuzhi=False
                print("退出while循环")

            print("循环标志:%s" % str(biaozhishuzhi))

            videoWriter.release()  #释放写入
            #获取文件时长,并移动文件到指定目录下的对应的秒数的目录下,
            getTimeAndMoveToMiao(filename=xierushipin, yidongdaogenmulu=xinjianmulu)

            print("写入%s文件完成" % xierushipin)
            jieshu = COUNT
            jilu = '第%s次剪切点,剪切开始%s到结束%s结束\n' % (str(i), str(chushi), str(jieshu))
            print(jilu)
            with open(r'%s_%s_jilu.txt' % (video_file, nowtime), 'a+', encoding='utf-8') as f:
                f.write(jilu)
        else:
            miaoshu = '第%s次剪切点,结束帧%s和开始帧%s相差%s小于5帧,不进行处理\n' %(str(i),str(frametoStop),str(frameToStart),str(zhenchazhi))
            print(miaoshu)
            with open(r'%s_%s_jilu.txt' % (video_file, nowtime), 'a+', encoding='utf-8') as f:
                f.write(miaoshu)

    print("退出for循环")

#获取指定文件夹下所有MP4文件的时长
def getFileNames(path,houzui=".mp4"):
    return [os.path.join(path,f) for f in os.listdir(path) if f.endswith(houzui)]

#如果不存在就创建
def createDir(file_dir):
    # 如果不存在文件夹,就创建
    if not os.path.isdir(file_dir):
        os.mkdir(file_dir)

#获取视频时长
def getTimeLong(videoFile):

    clip = VideoFileClip(videoFile)
    sicahng = clip.duration
    print(sicahng) # seconds
    clip.close()
    return sicahng
#移动文件到指定文件夹下的yiqiege目录
def moveFile(zhidingmulu,file_path):
    try:
        # 移动文件到文件夹目录中
        shutil.move(file_path, zhidingmulu)
        print("移动文件%s到已切割文件夹" % file_path)
    except Exception as e:
        print("移动出错:%s" % str(e))

#读取文件时长,并移动到对应秒数的文件夹中
def getTimeAndMoveToMiao(filename,yidongdaogenmulu):
    #文件
    one = filename

    path = yidongdaogenmulu
    try:
        one_shichang = getTimeLong(one)
        print("%s文件的时长为 %s 秒"%(one,one_shichang))
        zhengshu = int(one_shichang)
        zhengshijia1 = zhengshu+1
        #移动到指定时间的文件夹
        xiaoyu1miao = "%s/大于%s秒小于%s秒"% (path,str(zhengshu),str(zhengshijia1))
        createDir(file_dir=xiaoyu1miao)
        moveFile(zhidingmulu=xiaoyu1miao, file_path=one)

    except Exception as e:
        print("%s文件的时长失败,原因:%s"%(one,str(e)))
        #移动到指定时间的文件夹
        jieshishibai = "%s/解析失败"% path
        createDir(file_dir=jieshishibai)
        moveFile(zhidingmulu=jieshishibai, file_path=one)


if __name__ == '__main__':
    a=datetime.datetime.now()
    startime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    genmulu = r"C:\4k\ceshi\daichuli"
    file_list = getFileNames(path=genmulu,houzui=".mp4")
    for one_file in file_list:
        try:
            print("处理%s文件"% str(one_file))
            video_file=one_file  #mp4文件
            qiefenwenjian = str(video_file).replace(".mp4",".edl")
            zhen_list = readQiFenWenJian(filename=qiefenwenjian)
            print("处理MP4视频文件:%s" % one_file)
            print("对应的edl文件:%s" % qiefenwenjian)
            handleOneVideo(video_file, zhen_list)
            miaoshu = "处理%s文件成功"% str(one_file)
            print(miaoshu)
            with open(r'%s_处理成功.txt' % (video_file, ), 'a+', encoding='utf-8') as f:
                f.write(miaoshu)
        except Exception as e:
            miaoshu = "处理%s文件失败,原因%s" % (str(one_file),str(e))
            print(miaoshu)
            with open(r'%s_处理失败.txt' % (video_file, ), 'a+', encoding='utf-8') as f:
                f.write(miaoshu)

    b = datetime.datetime.now()
    endtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    cha = (b-a).seconds #时间差的计算,单位为秒
    print("程序开始运行时间:")
    print(startime)
    print("程序结束运行时间:")
    print(endtime)
    print("耗时:")
    print(cha)
    print("秒")
    print(cha/60)
    print("分")

 

标签:文件,str,list,MP4,文件夹,shifenmiao,file,print,path
From: https://www.cnblogs.com/jingzaixin/p/18104051

相关文章

  • pdf文件压缩后不清晰?那是方法没选对!
    分享或存储PDF文件时,如何文件过大怎么办?那么肯定是先对其进行压缩。但有些压缩工具在减小文件大小的同时,文件的清晰度也变了,导致PDF文件变得模糊。有那些简单的方法和工具,可以在压缩PDF文件后依然保持清晰度?在进行PDF压缩时,选择一款高质量的压缩工具至关重要。以下几款工具在压缩......
  • 深入理解nginx mp4流媒体模块[下]
    深入理解nginxmp4流媒体模块[上]深入理解nginxmp4流媒体模块[中]  以下对各个mp4的加载过程依次进行分析。1.加载ftypatom  加载ftypatom的逻辑由ngx_http_mp4_read_ftyp_atom函数来完成,其最主要的逻辑就是将文件中读取到的ftypatom放到ngx_http_mp4_file_t上......
  • 学习过程中,项目文件、代码疑惑点
    python项目为什么有requirements.txt文件?使用目的:任何应用程序通常需要设置安装所需并依赖一组类库来满足工作要求。要求文件是指定和一次性安装包的依赖项具体一整套方法。requirements.txt文件格式:格式一:直接指定库#Thesemustbeinstalledbeforebuildingmmdetection......
  • python根据达芬奇场景分析保存的edl文件,智能裁切输出4K视频画面(不带声音)-自动找到MP
    使用前先将mp4对应的EDL文件命名为相同的名字,如:春天.mp4,春天.edl只处理持续时间大于5帧的画面importcv2importosimporttimeimportdatetimeimportshutilfrommoviepy.editorimportVideoFileClip#读取切分文件defreadQiFenWenJian(filename):withopen(......
  • Java Swing容器:文件对话框
           文件对话框是专门用于对文件或目录进行浏览和选择的对话框。可以使用JFileChooser类创建文件对话框,其主要构造方法如下:JFileChooser():根据用户默认目录创建文件对话框。JFileChooser(FilecurrentDirectory):根据File型参数所指定的目录创建文件对话框。JFileCho......
  • 使用 CRXJS、Vite、TypeScript、React、Zustand、Antd 开发 Chrome 浏览器插件——自
    一、CRXJS一、什么是CRXJS?CRXJSVitePlugin是一款使用现代Web开发技术制作Chrome扩展的工具二、CRXJS的作用CRXJS支持热加载和静态资源导入,无需手动构建配置工具CRXJSVite插件通过将Vite的精细功能与简单的配置策略相结合,简化了Chrome扩展开发者体验二......
  • 使用cmd或PowerShell计算文件夹中的文件数量
    一、echo"CD需统计目录(PowerShell命令)"echo"1.统计文件和文件夹数(不会递归工作,只计算第一级元素)"(Get-ChildItem|Measure-Object).Countecho"2.统计文件夹数(不会递归工作,只计算第一级元素)"(Get-ChildItem-Directory|Measure-Object).Countecho"3.统计文件夹中的......
  • golang 读取文件内容,清空文件内容,把读取的内容写入到文件里
    packagemainimport( "encoding/json" "fmt" "io" "log" "os")typePvRelationListstruct{ Item[]PvRelationInfo`json:"item"`}typePvRelationInfostruct{ PodNamestring`json:"p......
  • C语言:文件操作
    1.什么是文件磁盘(硬盘)上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。1.1 程序文件程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程(windows环境后缀为.exe)。1.2数据文件文件的内容不一定......
  • 如何在Java中读取超过内存大小的文件
    读取文件内容,然后进行处理,在Java中我们通常利用Files类中的方法,将可以文件内容加载到内存,并流顺利地进行处理。但是,在一些场景下,我们需要处理的文件可能比我们机器所拥有的内存要大。此时,我们则需要采用另一种策略:部分读取它,并具有其他结构来仅编译所需的数据。接下来,我们就来......