我曾使用 FFmpeg 从 MKV/MP4 文件中提取所有 I 帧,但 FFmpeg 似乎会解码所有帧才能完成此操作,因此如果视频文件是 1080p 且时长超过 10 分钟,则需要很长时间。我只希望它从 I 帧跳转到 I 帧并将它们转储到 JPG/PNG 文件中。此外,我需要知道 I 帧的时间戳。
另一个选择是使用 FFprobe 获取所有 I 帧的时间戳,但这也会解码整个文件。
我正在尝试做类似 Avidemux 的事情。在 Avidemux 中,您只需按向上或向下箭头键即可快速跳转到每个 I 帧,但它无需解码所有 B/P 帧即可做到这一点。
答案1
使用
ffmpeg -skip_frame nokey -i file -vsync 0 -frame_pts true out%d.png
skip_frame
告诉解码器仅处理关键帧。-vsync 0
(在此命令中)保留时间戳。设置输出图像文件名的数字部分以表示时间戳。数字的解释需要您知道帧速率,例如,如果帧速率为 30,则图像名称 out75 对应的时间戳为 75/30 = 2.50 秒。如果您希望数字表示毫秒,则-frame_pts
可以添加。-r 1000