用Python进行代码编写,利用imageio-ffmpeg函数依赖,兼容编码格式为 HVC1 / H.265 的视频,可对文件夹内的视频进行批量操作,可对提取的图片自定义名称;可自定义提取每秒提取帧率数量
E:/FAST-data/Pic/
├── DJI_20250429_0001_S/
│ ├── frame_000000.jpg
│ ├── frame_000030.jpg
│ └── ...
├── DJI_20250429_0002_S/
│ ├── ...
python -m pip install imageio[ffmpeg]
输入|输出文件夹修改、确定每秒提取的帧
input_dir = r"输入视频文件夹地址"
output_dir = r"输出文件夹地址"
extract_fps = 2 # 每秒提取 x 帧
自定义提取图片的名称
filename = f"{output_dir[-6:-1]}{i:06d}_{output_dir[-1:]}.jpg"
4、完整代码展示
import os
import imageio.v3 as iio
def extract_hvc1_frames(video_path, output_dir, extract_fps=1):
try:
meta = iio.immeta(video_path)
fps = meta.get("fps", 30)
except Exception as e:
print(f"❌ 读取元数据失败: {video_path},原因: {e}")
return
interval = round(fps / extract_fps)
print(f"️ 正在处理: {video_path}")
print(f" 帧率: {fps:.2f},每 {interval} 帧提取一帧")
os.makedirs(output_dir, exist_ok=True)
try:
for i, frame in enumerate(iio.imiter(video_path)):
if i % interval == 0:
filename = f"{output_dir[-6:-1]}{i:06d}_{output_dir[-1:]}.jpg"
save_path = os.path.join(output_dir, filename)
iio.imwrite(save_path, frame)
print(f" ✅ 保存: {save_path}")
except Exception as e:
print(f"❌ 提取过程中失败: {video_path},原因: {e}")
return
print(f"✅ 提取完成: {video_path}\n")
def batch_extract_all_videos(input_folder, output_folder, extract_fps=1):
supported_exts = ('.mp4', '.mkv', '.mov', '.avi')
for fname in os.listdir(input_folder):
if fname.lower().endswith(supported_exts):
video_path = os.path.join(input_folder, fname)
base_name = os.path.splitext(fname)[0]
save_dir = os.path.join(output_folder, base_name)
extract_hvc1_frames(video_path, save_dir, extract_fps)
if __name__ == "__main__":
input_dir = r"E:\FAST-data\Video"
output_dir = r"E:\FAST-data\Pic"
extract_fps = 2 # 每秒提取 x 帧
batch_extract_all_videos(input_dir, output_dir, extract_fps)