You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python OpenCV设置视频捕获时长并连续录制多段无丢帧视频

实现连续录制固定时长的无帧丢失视频

嘿,作为编程新手能想到要避免帧丢失这点很棒!我会基于你提到的OpenCV视频捕获代码,修改出符合你需求的版本——连续录制多个3分钟的视频,全程保证不丢帧。

核心思路

要做到无帧丢失,绝对不能用sleep()来控制时长(因为sleep会阻塞程序,错过摄像头捕获的帧),正确的做法是:

  • 先获取摄像头的实际帧率
  • 计算3分钟对应的总帧数(帧率 × 秒数)
  • 每录制满对应帧数,就切换到新的视频文件继续录制,全程保持摄像头处于打开状态

完整代码实现

import cv2

# -------------------------- 配置参数 --------------------------
RECORD_DURATION_MINUTES = 3  # 每个视频的时长(分钟)
FRAME_WIDTH = 640  # 视频宽度
FRAME_HEIGHT = 480  # 视频高度
CAMERA_INDEX = 0  # 默认摄像头索引(通常0是内置摄像头)
# 视频编码格式,根据系统选择:Windows用'XVID',Mac/Linux可以用'MJPG'或'AVC1'
FOURCC = cv2.VideoWriter_fourcc(*'XVID')
# -------------------------------------------------------------

def main():
    # 初始化摄像头,保持持续打开状态(避免重新打开丢帧)
    cap = cv2.VideoCapture(CAMERA_INDEX)
    if not cap.isOpened():
        print("无法打开摄像头!")
        return
    
    # 获取摄像头的实际帧率(非常重要,用来计算总帧数)
    fps = cap.get(cv2.CAP_PROP_FPS)
    if fps == 0:
        # 如果无法自动获取帧率,手动设置一个常见值(比如30)
        fps = 30
        print(f"无法获取摄像头帧率,将使用默认值:{fps} FPS")
    
    # 计算每个视频需要录制的总帧数
    total_frames_per_video = int(fps * RECORD_DURATION_MINUTES * 60)
    print(f"每个视频将录制 {total_frames_per_video} 帧(约{RECORD_DURATION_MINUTES}分钟)")
    
    video_count = 0  # 视频文件计数器,用来生成递增的文件名
    frame_count = 0  # 当前视频已录制的帧数
    out = None  # 视频写入对象
    
    try:
        while True:
            # 捕获一帧
            ret, frame = cap.read()
            if not ret:
                print("无法读取摄像头帧,退出录制")
                break
            
            # 如果当前视频还没初始化,或者已经录满帧数,创建新的视频文件
            if out is None or frame_count >= total_frames_per_video:
                if out is not None:
                    # 关闭之前的视频文件
                    out.release()
                    print(f"已完成录制:video_{video_count}.avi")
                
                # 递增计数器,创建新的视频写入对象
                video_count += 1
                frame_count = 0
                output_filename = f"video_{video_count}.avi"
                out = cv2.VideoWriter(output_filename, FOURCC, fps, (FRAME_WIDTH, FRAME_HEIGHT))
                print(f"开始录制新视频:{output_filename}")
            
            # 写入当前帧到视频文件
            out.write(frame)
            frame_count += 1
            
            # 显示预览窗口(按q键停止录制)
            cv2.imshow('Recording', frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
            
    finally:
        # 释放所有资源
        if out is not None:
            out.release()
        cap.release()
        cv2.destroyAllWindows()
        print("录制已停止,资源已释放")

if __name__ == "__main__":
    main()

关键部分解释

  1. 参数配置:你可以根据自己的需求修改时长、分辨率、摄像头索引和编码格式
  2. 摄像头持续打开:全程只初始化一次cv2.VideoCapture,避免反复打开/关闭摄像头导致的帧丢失
  3. 帧数计算:用帧率×时长(秒)得到每个视频的总帧数,确保录制时长准确且无丢帧
  4. 自动切换文件:每录满对应帧数就关闭当前视频文件,创建新的文件继续录制,文件名自动递增(video_1.avi、video_2.avi...)
  5. 异常处理:finally块确保程序无论正常退出还是异常退出,都会释放摄像头和视频写入资源

注意事项

  • 编码格式:如果录制的视频无法播放,尝试更换FOURCC的值,比如Windows用'XVID',Mac可以试试'avc1',Linux用'MJPG'
  • 权限:确保你的程序有访问摄像头的权限
  • 预览窗口:按q键可以随时停止录制

内容的提问来源于stack exchange,提问作者mrs3733

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:10:03