如何从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
相关产品推荐
相关产品推荐

