OpenCV保存视频覆盖旧文件问题:实现按当日日期命名避免覆盖
解决OpenCV保存视频覆盖旧文件的问题:按日期时间命名
嘿,这个问题我之前也踩过坑!其实根本不用纠结复杂的if判断,核心就是动态生成带时间戳的唯一文件名,这样每次保存的视频都不会重名,自然就不会覆盖旧文件了。下面给你一套可行的实现方案:
核心思路
用Python的datetime模块获取当前的日期和时间,把它格式化成字符串作为视频文件名。如果担心同一天多次录制会覆盖,加上时分秒就能保证文件名绝对唯一,彻底避免覆盖问题。
完整代码示例
import cv2 import datetime import os # 1. 生成带日期时间的文件名(精确到秒,从源头避免重名) current_datetime = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") output_filename = f"{current_datetime}.avi" # 可选:极端情况防护(比如同一秒内多次启动程序),自动添加计数器 counter = 1 while os.path.exists(output_filename): output_filename = f"{current_datetime}_{counter}.avi" counter += 1 # 2. 初始化摄像头和视频写入器 cap = cv2.VideoCapture(0) # 0表示默认摄像头,可根据你的设备调整编号 if not cap.isOpened(): print("无法打开摄像头,请检查设备连接") exit() # 获取摄像头的基础参数(宽、高、帧率) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = int(cap.get(cv2.CAP_PROP_FPS)) # 设置视频编码器(XVID兼容性极强,几乎所有播放器都支持) fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter(output_filename, fourcc, fps, (frame_width, frame_height)) # 3. 开始录制(按q键停止) print("开始录制,按q键退出...") while cap.isOpened(): ret, frame = cap.read() if not ret: print("无法获取视频帧,结束录制") break out.write(frame) # 将帧写入视频文件 cv2.imshow('录制窗口', frame) # 监听键盘输入,按q退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 4. 释放所有资源 cap.release() out.release() cv2.destroyAllWindows() print(f"视频已成功保存为:{output_filename}")
关键细节说明
- 文件名格式化:
%Y-%m-%d_%H-%M-%S会生成类似2024-05-20_14-30-45.avi的文件名,精确到秒,几乎不可能出现重名。如果只需要按日期命名(确保当天只录一个视频),可以简化为%Y-%m-%d.avi。 - 可选重名防护:那段while循环是为了应对极端场景(比如同一秒内两次启动录制程序),自动给文件名加上计数器(如
2024-05-20_14-30-45_1.avi),进一步杜绝覆盖风险。 - 编码器选择:XVID是跨平台兼容性最好的编码器之一,如果需要保存为MP4格式,可以将编码器换成
mp4v,同时把文件名后缀改成.mp4即可。
为什么之前的if判断没成功?
大概率是因为你仅判断了旧文件存在,但没有动态生成新的唯一文件名,或者没有把新文件名正确传递给VideoWriter。现在这个方案从源头解决问题——每次生成独一无二的文件名,根本不需要额外判断旧文件是否存在(除非你要处理极端边缘情况)。
内容的提问来源于stack exchange,提问作者CoffeeWaterController




