【OpenCV】2 读取视频帧 与 将视频数据录制为多媒体文件
<
一、从摄像头采集视频

代码
import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 创建窗口
# 获取视频设备
cap = cv2.VideoCapture(0)
while True:
# 从摄像头读视频帧
ret, frame = cap.read()
# 将视频帧在窗口显示
cv2.imshow('video', frame)
# 等待键盘事件
key = cv2.waitKey(1)
if (key & 0xFF == ord('q')):
break
# 释放
cap.release()
cv2.destroyAllWindows()
备注
💡 delay值如何设置 ?
cv2.waitKey(delay) 函数的括号里的参数 delay 表示等待键盘事件的时间,单位是毫秒(ms)。
当 delay = 0 时:程序会无限等待,直到用户按下任意键后才会继续执行后续代码
当 delay > 0 时:程序会等待指定的毫秒数,如果在这段时间内用户按下了键,就会返回该键的 ASCII 码值;如果超过指定时间仍未按键,就会返回 -1
在实际应用中:
对于视频播放或实时图像处理,通常设置为 1(如 cv2.waitKey(1)),这样可以实现流畅的实时效果,同时监听键盘事件
如果想让窗口暂停,直到用户按下键再继续,就用 cv2.waitKey(0)
如果希望程序等待一段时间(比如 1 秒)再自动继续,可以设置为 1000
二、从多媒体文件中读取视频帧
代码
import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 创建窗口
# 从视频文件中读取视频帧
cap = cv2.VideoCapture("video/video.mp4")
while True:
# 从摄像头读视频帧
ret, frame = cap.read()
# 将视频帧在窗口显示
cv2.imshow('video', frame)
# 等待键盘事件
key = cv2.waitKey(33)
if (key & 0xFF == ord('q')):
break
# 释放
cap.release()
cv2.destroyAllWindows()
备注
💡 为什么设为waitKey设为33?

1秒30帧 → 1000 ms 30帧 → 每帧间隔约33ms
这样播放和原视频速度基本一样
三、将视频数据录制为多媒体文件
代码

import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 创建窗口
# 获取视频设备
cap = cv2.VideoCapture(0)
# 视频输出路径
OUTPUT = 'video/video_output.mp4'
# 编码器
fourcc = cv2.VideoWriter_fourcc(*"MJPG")
# 获取摄像头参数(确保获取正确的宽高)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
camera_info = (width, height)
# 创建 VideoWriter
vw = cv2.VideoWriter(OUTPUT, fourcc, 25, camera_info) # 分辨率要与采集摄像头一致
# 判断摄像头是否打开
while cap.isOpened():
# 从摄像头读视频帧
ret, frame = cap.read()
if ret == True:
# 将视频帧在窗口显示
cv2.imshow('video', frame)
# 写数据到多媒体文件
vw.write(frame)
# 等待键盘事件
key = cv2.waitKey(1)
if (key & 0xFF == ord('q')):
break
else:
break
# 释放
cap.release()
vw.release()
cv2.destroyAllWindows()
备注
💡 OpenCV: FFMPEG: tag 0x47504a4d/'MJPG' is not supported with codec id 7 and format 'mp4 / MP4 (MPEG-4 Part 14)'
控制台输出提示信息:
OpenCV: FFMPEG: tag 0x47504a4d/'MJPG' is not supported with codec id 7 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'
原因:
使用 MJPG 编码来保存 MP4 格式的视频
MP4 容器格式通常不支持 MJPG 编码,FFMPEG 自动回退到了 mp4v(MPEG-4 视频)编码
解决:
更改输出视频的格式为支持 MJPG 的格式,如 AVI
# OUTPUT = 'video/video_output.mp4'
OUTPUT = 'video/video_output.avi'
或者更改输出视频的编码格式为 MP4 支持的格式,如
# fourcc = cv2.VideoWriter_fourcc(*"MJPG")
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
浙公网安备 33010602011771号