【OpenCV】2 读取视频帧 与 将视频数据录制为多媒体文件

<

一、从摄像头采集视频

image

代码

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?
image
1秒30帧 → 1000 ms 30帧 → 每帧间隔约33ms
这样播放和原视频速度基本一样

三、将视频数据录制为多媒体文件

代码

image

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")
posted @ 2025-09-04 13:30  苦涩如影相随固  阅读(11)  评论(0)    收藏  举报