数据集制作-FFMPEG从视频提取关键帧
# 数据集制作-ffmpeg从视频提取关键帧
使用ffmpeg从视频中提取关键帧(I帧)并处理为固定尺寸的图像,并输出为PNG或JPEG格式。
# 方法1:单行命令
# 使用ffmpeg提取I帧
# 使用FFmpeg提取I帧
ffmpeg -skip_frame nokey -i input.mp4 -vsync 0 out/frame_%03d.jpg
1
2
2
# 使用ffmpeg提取I帧并修改图像大小
# 输出PNG格式
ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I),scale=w=244:h=244:force_original_aspect_ratio=1,pad=244:244:(ow-iw)/2:(oh-ih)/2:color=gray" -vsync vfr out/output_%03d.png
1
# 命令详解:
select=eq(pict_type\,I)
选择所有I帧(关键帧)。scale=w=244:h=244:force_original_aspect_ratio=1
将图像缩放至目标尺寸(244x244),force_original_aspect_ratio=1
(缩写:force_original_aspect_ratio=decrease
)确保缩放后保持原始宽高比,图像不会变形。pad=244:244:(ow-iw)/2:(oh-ih)/2:color=gray
将缩放后的图像填充至244x244:(ow-iw)/2
和(oh-ih)/2
:自动计算左右/上下填充,使图像居中。color=gray
:使用灰色(十六进制#808080
)填充空白区域。
-vsync vfr
确保输出帧率与输入I帧的实际频率一致(可变帧率)。output_%03d.png
输出文件名格式(例如:output_001.png
,output_002.png
等),使用PNG格式保留无损质量。如需JPEG,可替换为.jpg
并添加-q:v 2
控制质量(值越小质量越高)。
# 输出JPEG格式
ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I),scale=244:244:force_original_aspect_ratio=1,pad=244:244:(ow-iw)/2:(oh-ih)/2:color=#808080" -vsync vfr -q:v 2 output_%03d.jpg
1
# 方法2:Python集成方案
import subprocess
import os
def extract_i_frames(input_video, output_dir="output", size=244, color="gray", img_format="png"):
"""
提取视频的 I 帧并处理为固定尺寸
参数:
input_video: 输入视频文件路径
output_dir: 输出目录 (默认: "output")
size: 输出图像尺寸 (默认: 244)
color: 填充颜色 (默认: "gray",支持颜色名称或十六进制值)
img_format: 输出格式 (默认: "png",支持 png/jpg)
"""
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 构建输出路径模板
output_template = os.path.join(output_dir, f"frame_%03d.{img_format}")
# 构建 FFmpeg 命令
command = [
"ffmpeg",
"-i", input_video,
"-vf", f"select=eq(pict_type\\,I)," # 选择 I 帧
f"scale={size}:{size}:force_original_aspect_ratio=1," # 等比缩放
f"pad={size}:{size}:(ow-iw)/2:(oh-ih)/2:color={color}", # 填充颜色
"-vsync", "vfr", # 可变帧率输出
]
# 根据格式添加质量参数
if img_format == "jpg":
command.extend(["-q:v", "2"]) # JPG 质量设置 (1-31, 2=高质量)
command.append(output_template)
try:
# 运行 FFmpeg 命令
subprocess.run(command, check=True)
print(f"成功提取 {len(os.listdir(output_dir))} 个 I 帧到 {output_dir} 目录")
except subprocess.CalledProcessError as e:
print(f"处理失败: {e}")
except FileNotFoundError:
print("错误: 未找到 ffmpeg,请确保已安装 FFmpeg 并添加到系统路径")
if __name__ == "__main__":
# 示例使用
extract_i_frames(
input_video="input.mp4", # 输入视频文件
output_dir="iframes", # 输出目录
size=244, # 图像尺寸
color="#808080", # 灰色填充 (支持英文名或十六进制)
img_format="png" # 输出格式
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 参数解释:
- input_video:输入视频文件路径(必需)
- output_dir:输出目录(默认:
"output"
) - size:输出图片尺寸(默认:
244
) - color:填充颜色(支持:颜色名称如
"gray"
/十六进制值如"#808080"
) - img_format:输出格式(
"png"
或"jpg"
,默认 PNG)
# 高级特性:
- 自动创建输出目录:如果输出目录不存在会自动创建
- 智能命名:输出文件按序列命名(
frame_001.png
) - 错误处理:捕获常见错误(FFmpeg 未安装/处理失败)
- 质量控制:JPG 输出自动使用高质量压缩
# 注意事项:
- 确保系统已安装 FFmpeg
- Windows 系统需将 FFmpeg 添加到 PATH 环境变量
- 对于大批量视频处理,建议增加日志记录功能
编辑 (opens new window)
上次更新: 2025/06/07, 21:53:36