Python | 常规的视频操作
2019-06-12 本文已影响0人
yuanCruise
常规的视频操作主要有:缩小视频分辨率,分辨率不变缩小视频保存空间,加快视频播放速度等功能。不得不说,利用Python及其相应的第三方库,能使得很多功能变的实现变得更加便捷。
利用Python的第三方库opencv,实现上述的常规视频操作的代码如下所示。后面将对代码段中各语句块功能进行详细描述。
import cv2
from cv2 import VideoWriter,VideoWriter_fourcc
video_root ="D:/yuanlei/test.avi"
out_root = "D:/yuanlei/out.avi"
cap = cv2.VideoCapture(video_root)
fps = cap.get(cv2.CAP_PROP_FPS)
video_width = cap.get()
video_height = cap.get()
resize_width = 1280
resize_height = 960
double_fps = 2*fps
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
videoWriter = cv2.VideoWriter(out_root,fourcc,fps,(1280,960))
success = cap.isOpened()
while (success):
success,frame = cap.read()
print("Read a new frame:",success)
if not success:
break
frame = cv2.resize(frame,(1280,960))
videoWriter.write(frame)
videoWriter.release()
如下部分的代码段,主要用于提取输入视频帧的各种原生参数,比如视频的帧率,视频帧的宽高信息等。
cap = cv2.VideoCapture(video_root)
fps = cap.get(cv2.CAP_PROP_FPS)
video_width = cap.get()
video_height = cap.get()
如下部分的代码段,用于计算需要对视频做一下操作时的参数,比如需要改变视频分辨率的对应宽高,又比如需要改变视频播放速度的帧率。
resize_width = 1280
resize_height = 960
double_fps = 2*fps
如下代码段,用于限定输出视频的编码格式,不同的编码格式所对应的存储空间差别较大,可以根据自己的需求改变对应的编码格式,opencv支持的编码格式有如下几种。
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
四个字符用来表示压缩帧的codec 例如:
CV_FOURCC('P','I','M','1') = MPEG-1 codec
CV_FOURCC('M','J','P','G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
NOTE:生成文件占用空间最小的编码方式是MPEG-4.2 codec。
在VideoWriter类的构造函数参数为CV_FOURCC('M', 'P', '4', '2') 。
最大的是MPEG-1 codec,
对应在VideoWriter类的构造函数参数为CV_FOURCC('P','I','M','1') ,
所占磁盘空间是前者的5.7倍。
所以如果需要24小时全天候录制监控,可以优先使用MPEG-4.2的编解码方式。
通过如下代码段,将提前设置好的需要对视频做更改的参数输入,构建一个视频输出流接口,用于对视频帧进行改变并重新写成视频。
videoWriter = cv2.VideoWriter(out_root,fourcc,fps,(1280,960))
最终通过如下代码段,对视频的每一帧进行读取和相应的操作,如下实例中是要将视频的每一帧的分辨率修改为(1280,960),所以需要对每一帧视频做resize之后,在通过上述构建的videoWriter写成视频。若是改变视频速度的话,已经在构建videoWriter的时候通过fps限定了,那么在该过程中只需要直接写入视频帧即可。
success = cap.isOpened()
while (success):
success,frame = cap.read()
print("Read a new frame:",success)
if not success:
break
frame = cv2.resize(frame,(1280,960))
videoWriter.write(frame)
videoWriter.release()