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

如何从3个视频按N秒间隔提取帧并保存至对应命名文件夹?

批量从多个视频提取帧的实现方案

没问题,我帮你调整代码来实现批量处理的需求,核心思路就是遍历你的目标视频列表,为每个视频自动生成对应的同名输出文件夹,然后复用你原来的单视频处理逻辑就可以了。

这里是修改后的完整代码,我还做了一些小优化提升健壮性:

import cv2
import os
import logging

def read_video(input_filename):
    return cv2.VideoCapture(input_filename)

def save_frame(count, sec, vid_cap, output_directory):
    vid_cap.set(cv2.CAP_PROP_POS_MSEC, sec * 1000)
    hasFrames, frame = vid_cap.read()
    if hasFrames:
        name = os.path.join(output_directory, f"frame{count}.png")
        cv2.imwrite(name, frame)
    return hasFrames

def get_frames(input_filename, output_directory, frameRate):
    """
    Capture images from a video at every specified interval (in seconds)
    :param frameRate: time interval between captured frames, in seconds.
    """
    try:
        if not os.path.exists(output_directory):
            os.makedirs(output_directory)
            logging.info(f"Created output directory: {output_directory}")
    except OSError as e:
        logging.error(f'Error creating directory {output_directory}: {e}')
        return  # 创建目录失败直接终止当前视频处理
    
    sec = 0.0
    count = 1
    vid_cap = read_video(input_filename)
    
    # 先检查视频能不能正常打开
    if not vid_cap.isOpened():
        logging.error(f"Failed to open video file: {input_filename}")
        return
    
    success = save_frame(count, sec, vid_cap, output_directory)
    while success:
        count += 1
        sec += frameRate
        sec = round(sec, 2)
        success = save_frame(count, sec, vid_cap, output_directory)
    
    vid_cap.release()  # 记得释放视频资源,避免内存泄漏
    logging.info(f"Finished processing {input_filename}, saved {count-1} frames to {output_directory}")

if __name__ == "__main__":
    # 配置日志,方便查看处理进度和问题
    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
    
    # 方式1:手动列出要处理的视频文件
    video_files = [
        'videos/vid1.flv',
        'videos/vid2.flv',
        'videos/vid3.flv'
    ]
    
    # 方式2:自动扫描指定目录下的所有FLV视频(适合视频较多的情况,注释掉方式1打开这个即可)
    # video_dir = 'videos'
    # video_files = [os.path.join(video_dir, f) for f in os.listdir(video_dir) if f.lower().endswith('.flv')]
    
    # 设置提取帧的间隔(单位:秒)
    frame_interval = 30
    
    # 循环处理每个视频
    for video_path in video_files:
        # 提取视频文件名(不带后缀)作为输出文件夹名
        video_name = os.path.splitext(os.path.basename(video_path))[0]
        # 把输出文件夹放在frames根目录下的子文件夹,结构更清晰
        output_dir = os.path.join('frames', video_name)
        # 调用帧提取函数
        get_frames(video_path, output_dir, frame_interval)

关键修改点说明:

  • 批量遍历逻辑:通过video_files列表批量处理视频,还提供了自动扫描目录的可选方式,不用手动一个个列视频路径。
  • 自动生成对应文件夹:用os.path.splitext(os.path.basename(video_path))[0]提取视频的纯名称(比如vid1.flv得到vid1),输出文件夹会自动创建在frames目录下的对应子文件夹里,完全符合你要的“与视频同名文件夹”的需求。
  • 健壮性优化:增加了视频打开检查,如果视频损坏或路径错误,会输出错误日志并跳过该视频,不会影响其他视频处理;同时添加了vid_cap.release()释放视频资源,避免长时间运行内存占用过高。
  • 日志优化:配置了日志输出,能清晰看到每个视频的处理进度、创建的目录、保存的帧数,方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:47:34