如何使用OpenCV、imutils实现视频每分钟自动保存并重启录制
解决方案
要实现每分钟自动分段保存录制视频,核心逻辑是在帧循环中增加时间校验,达到设定时长后自动关闭当前视频写入器,生成新文件后继续录制。
完整修改后代码
import imutils import cv2 import time # 新增:用于计算录制时长 # 配置参数 video = "" SEGMENT_DURATION = 60 # 单段视频时长,单位秒,这里设60即1分钟 FPS = 25 # 录制帧率 if video == "": print("[webcam start]") vs = cv2.VideoCapture(0) else: print("[video start]") vs = cv2.VideoCapture(video) writer = None segment_start_time = time.time() # 记录当前分段的开始时间 while True: ret, frame = vs.read() if frame is None: break frame = imutils.resize(frame, width=320, height=240) cv2.imshow("frame", frame) # 原有的退出逻辑保留 key = cv2.waitKey(1) & 0xFF if key == ord("q"): break # 新增:判断是否到分段时间 if time.time() - segment_start_time >= SEGMENT_DURATION: # 关闭当前写入器,完成上一段视频保存 if writer is not None: writer.release() # 重置写入器和分段开始时间,下一轮生成新文件 writer = None segment_start_time = time.time() print("已完成1分钟分段录制,启动新片段录制") # 写入器为空时,创建新的视频文件,文件名带时间戳避免覆盖 if writer is None: fourcc = cv2.VideoWriter_fourcc(*"MJPG") # 生成带时间戳的文件名,格式:result_video_年月日_时分秒.avi result_path = f"result_video_{time.strftime('%Y%m%d_%H%M%S')}.avi" writer = cv2.VideoWriter(result_path, fourcc, FPS, (frame.shape[1], frame.shape[0]), True) # 写入当前帧 if writer is not None: writer.write(frame) # 释放资源 vs.release() # 新增:退出时释放当前写入器,保证最后一段视频正常保存 if writer is not None: writer.release() cv2.destroyAllWindows()
核心改动说明
- 新增
time模块计算录制时长,可通过修改SEGMENT_DURATION参数自定义单段视频的时长 - 每个分段视频使用带时间戳的独立文件名,不会出现旧文件被覆盖的问题
- 达到分段时长时自动完成上一段视频的保存,自动初始化新的写入器开启下一轮录制
- 补充了退出时的写入器释放逻辑,避免最后一段录制的视频文件损坏
内容的提问来源于stack exchange,提问作者MinJae
相关产品推荐
相关产品推荐

