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()
Posted on 2022-02-21 16:59  阿黎~  阅读(43)  评论(0编辑  收藏  举报