Python 实现从 MP4 视频文件中平均提取指定数量的帧
Python 实现从 MP4 视频文件中平均提取指定数量的帧
flyfish
从 MP4 视频文件中平均提取指定数量的帧,并将这些帧保存为 JPEG 图像文件。它支持处理单个 MP4 文件,也能遍历指定文件夹中的所有 MP4 文件并对每个文件进行帧提取操作。保存的图像文件名包含原视频文件名和帧序号,方便识别。
import cv2
import os
import sysdef extract_frames_from_video(video_path, n, output_folder):# 打开视频文件cap = cv2.VideoCapture(video_path)if not cap.isOpened():print(f"无法打开视频文件: {video_path}")return# 获取视频的总帧数total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))if total_frames < n:print(f"视频 {video_path} 的帧数少于要提取的帧数,无法完成提取。")cap.release()return# 计算每帧之间的间隔frame_interval = (total_frames - 1) // (n - 1) if n > 1 else 0video_name = os.path.splitext(os.path.basename(video_path))[0]for i in range(n):frame_index = i * frame_interval# 定位到指定帧cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index)ret, frame = cap.read()if ret:frame_filename = os.path.join(output_folder, f'{video_name}_frame_{i}.jpg')cv2.imwrite(frame_filename, frame)print(f"从 {video_path} 提取的第 {i} 帧已保存为 {frame_filename}")else:print(f"无法从 {video_path} 提取第 {i} 帧")# 释放视频捕获对象cap.release()def extract_frames(path, n, output_folder):if not os.path.exists(output_folder):os.makedirs(output_folder)if os.path.isfile(path):if path.lower().endswith('.mp4'):extract_frames_from_video(path, n, output_folder)else:print(f"{path} 不是有效的 MP4 文件。")elif os.path.isdir(path):for root, _, files in os.walk(path):for file in files:if file.lower().endswith('.mp4'):video_path = os.path.join(root, file)extract_frames_from_video(video_path, n, output_folder)else:print(f"{path} 不是有效的文件或文件夹路径。")if __name__ == "__main__":path = '.' if len(sys.argv) < 2 else sys.argv[1]n = 2 if len(sys.argv) < 3 else int(sys.argv[2])output_folder = 'output' if len(sys.argv) < 4 else sys.argv[3]extract_frames(path, n, output_folder)
使用方法
代码运行
将上述代码保存为 extract_frames.py
文件,然后在命令行中运行该脚本,有以下几种使用方式:
1. 使用默认参数
若不提供任何参数,代码会使用默认值。默认会处理当前目录下的所有 MP4 文件,提取 2 帧,并将提取的帧保存到 output
文件夹中。
python extract_frames.py
2. 自定义视频文件或文件夹路径
可以指定要处理的单个 MP4 文件路径或包含多个 MP4 文件的文件夹路径,同时可以指定要提取的帧数和输出文件夹路径。
python extract_frames.py /path/to/video_or_folder 4 /path/to/output_folder
/path/to/video_or_folder
:可以是单个 MP4 文件的完整路径,也可以是包含多个 MP4 文件的文件夹路径。4
:要从每个视频文件中提取的帧数。/path/to/output_folder
:保存提取帧图像的输出文件夹路径。若该文件夹不存在,代码会自动创建。
3. 部分参数使用默认值
你也可以只指定部分参数,其余参数使用默认值。例如,只指定视频文件或文件夹路径和要提取的帧数,输出文件夹使用默认的 output
文件夹:
python extract_frames.py /path/to/video_or_folder 4
运行脚本后,程序会在指定的输出文件夹中生成一系列 JPEG 图像文件,文件名格式为 {video_name}_frame_{i}.jpg
,其中 {video_name}
是原视频文件名,{i}
是帧的序号。