You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动