使用opencv保存视频需要用到VideoWriter对象
VideoWriter(filename, fourcc, fps, frame_size[, isColor])
参数:
-
filename:文件路径
-
fourcc:Four-Character Codes,四字符代码,该编码由四个字符组成
设置fourcc有两种写法:
1、cv2.VideoWriter_fourcc(‘O’,‘O’,‘O’,‘O’)
2、cv2.VideoWriter_fourcc(*‘OOOO’)
O代表一个字符,英文要么全部大写,要么全部小写I420,YUV编码,视频格式为.avi PIM1,MPEG-1编码,视频格式为.avi XVID,MPEG-4编码,视频格式为.avi THEO,Ogg Vorbis,视频格式为.ogv FLV1,Flash视频,视频格式为.flv AVC1,H264编码 DIV3,MPEG-4.3编码 DIVX,MPEG-4编码 MP42,MPEG-4.2编码 MJPG,motion-jpeg编码 U263,H263编码 I263,H263I编码 MP4V,视频格式为.mp4
例如:
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
- fps:被创建视频流的帧率
- frame_size:视频流的大小
- isColor:如果为True则每一帧为彩色图,否则为灰度图,默认为True
录制视频代码:
import cv2
# 0表示从摄像投中读取视频,如果是视频文件直接写地址就好
vc = cv2.VideoCapture(0)
# 设置FPS为60帧
vc.set(cv2.CAP_PROP_FPS, 60)
# 获取FPS 每秒多少张图片
FPS = int(vc.get(cv2.CAP_PROP_FPS))
# 设置编码类型为mp4
FOURCC = cv2.VideoWriter_fourcc(*'mp4v')
# 录制avi的视频
# vc.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
# FOURCC = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
# 可以指定图像的宽高,但要与写入时一致,这里直接得到摄像头拍摄的视频的宽和高
WIDTH = int(vc.get(cv2.CAP_PROP_FRAME_WIDTH))
HEIGHT = int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建VideoWriter对象,用于视频保存
videoWrite = cv2.VideoWriter('test.mp4', FOURCC, FPS, (WIDTH, HEIGHT))
while vc.isOpened():
ret, frame = vc.read()
frame = cv2.flip(frame, -1)
if not ret:
break
cv2.imshow('frame', frame)
videoWrite.write(frame)
if cv2.waitKey(10) & 0xFF == 27:
break
# 释放
videoWrite.release()
vc.release()
vc.destroyAllWindows()
录制只保存最新的10秒钟视频:
对于有些项目而言不需要将视频全部保存下来,只需要保存最新录制的一段视频,这里我采用使用队列的方式保存视频帧,当超过一定的帧数是,先入队的队头出队,后入对的队尾入队。
在录制视频的代码上做出修改:
先创建队列类:
class Queue:
def __init__(self):
# 初始化队列
self.items = []
def isEmpty(self):
# 清空队列
return self.items == []
def enqueue(self, item):
# 队尾入队
self.items.insert(0,item)
def dequeue(self):
# 队头出队
return self.items.pop()
def size(self):
# 队列长度
return len(self.items)
# 初始化队列
q=Queue()
q.isEmpty()
以30帧录制并保存最新10秒的视频:
# 0表示从摄像投中读取视频,如果是视频文件直接写地址就好
vc = cv2.VideoCapture(0)
# 设置FPS为30帧
vc.set(cv2.CAP_PROP_FPS, 30)
# 获取FPS 每秒多少张图片
FPS = int(vc.get(cv2.CAP_PROP_FPS))
# 设置编码类型为mp4
FOURCC = cv2.VideoWriter_fourcc(*'mp4v')
# 录制avi的视频
# vc.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
# FOURCC = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
# 可以指定图像的宽高,但要与写入时一致,这里直接得到摄像头拍摄的视频的宽和高
WIDTH = int(vc.get(cv2.CAP_PROP_FRAME_WIDTH))
HEIGHT = int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建VideoWriter对象,用于视频保存
videoWrite = cv2.VideoWriter('test.mp4', FOURCC, FPS, (WIDTH, HEIGHT))
# 保存300帧
FRAME_NUM = 300
while vc.isOpened():
ret, frame = vc.read()
frame = cv2.flip(frame, -1)
if not ret:
break
cv2.imshow('test', frame)
# 队尾入队
q.enqueue(frame)
# 当录制帧数大于设定帧数,则队尾入队
if(q.size() > FRAME_NUM):
q.dequeue()
# 手动按q关闭,关闭时保存视频
if cv2.waitKey(33) & 0xFF == ord('q'):
for i in range(q.size()):
videoWrite.write(q.items[i])
break