有时很长的一段视频我们感兴趣的只是某一部分,因此需要将那一部分视频截取出来。 之前一直在用QQ影音、PotPlayer等软件的视频截取功能,不能说不好用,但还是有些不方便。 于是就自己动手写了段代码,实现截取功能,这样以后就更方便了。 这里给出的代码不是最新的代码,有点小问题。最新代码放在了Github上,点击查看。
一、代码
# coding=utf-8
import cv2
# 输入需要处理的视频文件
video_path = raw_input("Input path of video:\n")
cap = cv2.VideoCapture(video_path)
# 获取视频的总帧数、fps
frames = int(cap.get(7))
fps = int(cap.get(5))
print (round(frames / fps, 2)).__str__(), 'seconds(', frames, 'frames', ') in total.'
# 输入输出影像的文件夹
out_path = raw_input("Input save path of video:\n")
# 输入开始时间
start = 0
start = input("Start second of output( >=0 ):\n")
# 输入结束时间
end = 0
str = "End second of output( <" + (frames / fps).__str__() + " )\n"
end = input(str)
# 计算需要输出的帧数
startIndex = int(start * fps)
endIndex = int(end * fps)
rangeFrames = endIndex - startIndex
count = 0
video_h = int(cap.get(4))
video_w = int(cap.get(3))
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(out_path, fourcc, fps, (video_w, video_h))
# 判断如果小于0,返回
if rangeFrames < 0:
print 'Error.'
exit()
# 输出提示信息
print rangeFrames, 'frames are going to be outputted.'
# 读取开始帧之前的内容,将将读取帧数定位到startIndex
for i in range(startIndex):
ret, frame = cap.read()
print "Pre-processing...", round((i * 1.0 + 1) / startIndex * 100, 2), '%'
print '---Cutting---'
# 循环输出帧
for i in range(startIndex, endIndex):
ret, frame = cap.read()
if frame is None:
break
else:
# 输出影像文件
out.write(frame)
count += 1
print 'Cutting...', round((count * 1.0 / rangeFrames) * 100, 2), "% finished."
# 释放对象
cap.release()
二、测试
依次输入视频路径、保存路径、截取开始时间、结束时间如下。 然后回车确定。程序首先读取视频进行预处理,如下。 预处理完成后,便开始截取。 等待截取完成即可。
本文作者原创,未经许可不得转载,谢谢配合