继续带来一个小玩意,视频无损分割,还是利用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 ("全部处理完成!")
网友评论