有时很长的一段视频我们感兴趣的只是某一部分,因此需要将那一部分视频截取出来。 之前一直在用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()

二、测试

依次输入视频路径、保存路径、截取开始时间、结束时间如下。 然后回车确定。程序首先读取视频进行预处理,如下。 预处理完成后,便开始截取。 等待截取完成即可。

本文作者原创,未经许可不得转载,谢谢配合

返回顶部