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

如何实现文件目录下多视频批量帧提取并保持帧编号全局连续?

批量视频帧全局连续编号提取方案

原有代码问题梳理

  • 变量拼写错误:循环遍历的变量写为intput_filenames,存在多打字母n的拼写错误
  • 未正确获取视频文件列表:input_filenames赋值为目录路径字符串,直接遍历字符串只会逐个返回字符,无法读取到目录下的视频文件
  • 缺少输出路径管理:提取的帧会默认保存到当前工作目录,没有统一归档
  • 预览等待逻辑不适配批量场景:每张帧等待100ms的逻辑如果是批量提取大量视频会非常耗时,仅适合小量测试

修正后可直接运行的代码

import cv2
import os

# 全局配置参数
start_index = 1  # 帧编号起始值
video_dir = 'Dataset/videos'  # 视频存放目录
frame_output_dir = 'Dataset/extracted_frames'  # 帧输出目录
supported_formats = ('.mp4', '.avi', '.mov', '.mkv', '.flv')  # 支持的视频格式
enable_preview = False  # 是否开启帧预览,批量提取建议关闭

# 初始化输出目录
os.makedirs(frame_output_dir, exist_ok=True)
current_idx = start_index

# 遍历目录下所有视频文件
for filename in os.listdir(video_dir):
    if not filename.lower().endswith(supported_formats):
        continue
    video_path = os.path.join(video_dir, filename)
    cap = cv2.VideoCapture(video_path)
    
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        # 保存帧,可调整命名格式,比如补6位零的写法:f"{current_idx:06d}.jpg"
        frame_save_path = os.path.join(frame_output_dir, f"{current_idx}.jpg")
        cv2.imwrite(frame_save_path, frame)
        # 预览逻辑
        if enable_preview:
            cv2.imshow('frame', frame)
            cv2.waitKey(100)
        current_idx += 1
    cap.release()

# 关闭所有预览窗口
if enable_preview:
    cv2.destroyAllWindows()

补充说明

  • 如果需要让帧按固定长度补零(比如000001.jpg、000002.jpg,避免系统按字符串排序时出现1.jpg排在10.jpg之后的问题),可以将保存时的文件名改为f"{current_idx:06d}.jpg",数字6代表总位数,可自行调整
  • 可通过修改supported_formats元组新增支持的视频格式
  • 批量提取时关闭enable_preview可大幅提升提取速度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:51:02