美文网首页
视频无损分割器 v1.0版

视频无损分割器 v1.0版

作者: 夜妖黑猫 | 来源:发表于2017-04-21 13:28 被阅读384次

继续带来一个小玩意,视频无损分割,还是利用Python+ffmpeg。刚好有几个超大的视频文件,单个拖到AE里卡的不行,于是想找一个分割视频的软件,然而网上下载的那些软件要么是利用转码(速度超慢),要么格式不支持。于是还是用万能的ffmpeg进行分割,再写个python自动化。输入的文件是什么格式的,输出的文件就是什么格式的,只是分割开好进行操作而已。

优点:
1、比那些坑爹软件支持的格式多多了。
2、硬盘读写有多快,分割得就有多快;因为没有利用转码,而是相当于直接把视频分段复制。
bug:
依然没有修文件名空格出错的bug,视频源文件里有空格的记得改名。

以下代码
——————

import os
import re
import sys
import math
import time
import subprocess
from subprocess import run


class VideoDurationProcess:
    def __init__(self, filename):
        self.filename = filename
        return
    def preprocess(self, filename):
        #初始化参数
        vfilename = self.filename
        logname = ""
        durtxt = ""
        durtime = ""
        duration = 0
        #进程
        parameter = "ffmpeg.exe -i " +sys.path[0]+"/"+vfilename + " -report"
        run(parameter,shell=True)
        logexists = False
        logdir = os.listdir()
        print ("读取视频信息...")
        print ("目前文件:"+vfilename)
        while logexists == False:
            for logfile in logdir:
                extname = os.path.splitext(logfile)[1][1:]
                if extname == "log":
                    durfile = logfile
                    readlog = open(durfile,'rb')
                    content = readlog.read().decode("utf-8")
                    readlog.close()
                    os.remove(logfile)
                    readdur = content[content.rfind("Duration:"):content.rfind("start")-2]
                    print (readdur)
                    reg='Duration\:\s(\d+)\:(\d+)\:([\d\.]+)'
                    durtime = re.compile(reg).findall(readdur)
                    duration = int(durtime[0][0])*3600 + int(durtime[0][1])*60 + float(durtime[0][2])
                    print ("总时长:"+str(duration)+"秒")
                    logexists = True
                    return duration
                else:
                    time.sleep(1)

class VideoCut:
    def __init__(self, filename):
        self.filename = filename
        return
    def process(self, filename, parttime):
        #初始化数据
        vfilename = "input/"+self.filename
        #可自定义输出后缀
        extvname = os.path.splitext(self.filename)[1][1:]
        #extvname = "mp4"
        durtime = VideoDurationProcess(vfilename).preprocess(vfilename)
        startat = 0
        #进程
        print ("预计分段数:"+str(math.ceil(int(durtime) / int(parttime))))
        print ("-------------")
        for i in range(1,math.ceil(int(durtime) / int(parttime)+1)):
            print ("正在分割第"+str(i)+"段...")
            parameter = "ffmpeg -n -ss "+str(startat)+" -i "+vfilename+" -c copy -t "+str(parttime)+" output/"+self.filename+"_"+str(i)+"."+extvname
            run(parameter,shell=True)
            startat+=parttime
        print ("-----------已完成:"+vfilename+"-----------")
        return
        

if __name__ == "__main__":
    #初始化介绍
    if os.path.exists("ffmpeg.exe"):
        print ("视频分割软件 by:Black")
        print ("-----------------------")
        print ("请将本文件及ffmpeg.exe放在同一目录下,")
        print ("并将要转换的视频放在input目录下")
    else:
        print ("请把ffmpeg放到本目录后重试...")
        pass
    #初始化参数

    if not os.path.exists("input"):
        os.mkdir("input")
    if not os.path.exists("output"):
        os.mkdir("output")
    parttime = input ("请输入每多少秒分一段:")
    print ("-----------------------")
    #获取文件&处理
    filesnames = os.listdir("input")
    for filename in filesnames:
        VideoCut(filename).process(filename, int(parttime))
    print ("全部处理完成!")

相关文章

网友评论

      本文标题:视频无损分割器 v1.0版

      本文链接:https://www.haomeiwen.com/subject/yjddzttx.html