如何用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()
关键部分解释
- 参数配置:你可以根据自己的需求修改时长、分辨率、摄像头索引和编码格式
- 摄像头持续打开:全程只初始化一次
cv2.VideoCapture,避免反复打开/关闭摄像头导致的帧丢失 - 帧数计算:用
帧率×时长(秒)得到每个视频的总帧数,确保录制时长准确且无丢帧 - 自动切换文件:每录满对应帧数就关闭当前视频文件,创建新的文件继续录制,文件名自动递增(video_1.avi、video_2.avi...)
- 异常处理:
finally块确保程序无论正常退出还是异常退出,都会释放摄像头和视频写入资源
注意事项
- 编码格式:如果录制的视频无法播放,尝试更换
FOURCC的值,比如Windows用'XVID',Mac可以试试'avc1',Linux用'MJPG' - 权限:确保你的程序有访问摄像头的权限
- 预览窗口:按
q键可以随时停止录制
内容的提问来源于stack exchange,提问作者mrs3733
相关产品推荐
相关产品推荐

