利用Python读取文件夹内视频并按帧率提取为图片格式

1、代码说明

        用Python进行代码编写,利用imageio-ffmpeg函数依赖,兼容编码格式为 HVC1 / H.265 的视频,可对文件夹内的视频进行批量操作,可对提取的图片自定义名称;可自定义提取每秒提取帧率数量

2、输出结构示例

E:/FAST-data/Pic/
├── DJI_20250429_0001_S/
│   ├── frame_000000.jpg
│   ├── frame_000030.jpg
│   └── ...
├── DJI_20250429_0002_S/
│   ├── ...

3、操作流程

3.1安装依赖

python -m pip install imageio[ffmpeg]

3.2修改参数

输入|输出文件夹修改、确定每秒提取的帧

    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)

你可能感兴趣的:(python,音视频,开发语言,HVC1)