1、视频录制
---创建fourcc
---创建videowriter对象为写多媒体文件,参数:文件路径,fourc,帧率,分辨率
---写数据到多媒体文件 write
---释放多媒体资源 release
代码:
import cv2
#创建fourcc
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
#创建videowriter对象为写多媒体文件,参数:输出文件,fourcc:多媒体文件格式,帧率,分辨率,分辨率需要和采集数据的摄像头的分辨率保持一致
vw = cv2.VideoWriter('~/0403.mp4',fourcc,25,(1280,720))
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,360)
#获取视频设备
cap = cv2.VideoCapture(0) #数字0代表从摄像头采集数据
while True:
#从摄像头获取视频帧
ret,frame = cap.read() #返回两个值,第一个为状态值,读到帧为tru。第二个值为视频帧
#将视频帧在窗口显示
cv2.imshow('video',frame)
vw.write(frame) #写数据到多媒体文件
#等待键盘事件,如果为,退出
key = cv2.waitKey(30) #这里的数字可以理解为帧与帧之间的间隔,如果一个视频是25帧,间隔设置为40以内,比如30会比较正常,否则会慢速播放
if(key & 0xFF == ord('q')):
break
#释放VideoCapture视频设备
cap.release()
#释放多媒体资源
vw.release()
#释放窗口
cv2.destroyAllWindows()
运行之后,可以点击q退出程序,在终端用ffplay ~/0403.mp4播放录制的文件
【补充】:
---20fps的概念: 1s=1000ms 1000/20=50ms。每帧之间相差50ms
---写入视频时必备的参数: 帧率(一秒写入多少帧,比如电影或者动画片是24帧) 分辨率(视频的宽和高时多少)
write:进行编码,写文件
先把数据写入缓存,在将数据从缓存写入文件系统中
---release: 释放资源,同时将缓存中的数据强制输出到磁盘中
---执行时如果出现以下错误:
可以将输出文件的后缀名改成avi,如 0403.avi
上面的代码优化:
1、优化窗口没有按指定的640,360展示
2、如果摄像头坏了不应该进入循环
3、如果没有读到视频帧不应该进行展示,写入数据
import cv2
#创建fourcc
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
#创建videowriter对象为写多媒体文件,参数:输出文件,fourcc:多媒体文件格式,帧率,分辨率,分辨率需要和采集数据的摄像头的分辨率保持一致
vw = cv2.VideoWriter('/Users/lililiee/Desktop/04/0406.mp4',fourcc,25,(1280,720)) #这里的文件名如果是avi就不会报错
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)
#获取视频设备
cap = cv2.VideoCapture(0) #数字0代表从摄像头采集数据
while cap.isOpened(): #如果摄像头被打开,则进入循环,否则摄像头无法正常打开,进入循环无意义
#从摄像头获取视频帧
ret,frame = cap.read() #返回两个值,第一个为状态值,读到帧为true。第二个值为视频帧
if ret==True: #读到了帧则展示,否则break
#将视频帧在窗口显示
cv2.imshow('video',frame)
#在展示时重新将窗口大小进行调整,设为指定大小
cv2.resizeWindow('video', 640, 360)
vw.write(frame) #写数据到多媒体文件
#等待键盘事件,如果为,退出
key = cv2.waitKey(30) #这里的数字可以理解为帧与帧之间的间隔,如果一个视频是25帧,间隔设置为40以内,比如30会比较正常,否则会慢速播放
if(key & 0xFF == ord('q')):
break
else:
break
#释放VideoCapture视频设备
cap.release()
#释放多媒体资源
vw.release()
#释放窗口
cv2.destroyAllWindows()