ffmpeg - 如何使用搜索捕获屏幕截图的时间戳并找到最近的 iframe?

Cha*_*irk 1 video ffmpeg

我尝试过各种不同的方法。ffprobe 始终显示出有意义的结果,使用以下命令,pts_time 随着帧的继续而增加:

ffprobe -show_frames video.mp4 > probestats.txt
Run Code Online (Sandbox Code Playgroud)

我考虑过使用该数据来查找最接近我在 ffmpeg 中寻找的秒数的视频帧,但我试图保持这种性能,因为我正在生成可能超过 5GB 的上传缩略图,这意味着我将结束需要解析 50MB 以上的探测文件。

因此,目前,我正在循环执行此 ffmpeg 命令,以便最终每个文件总共有 10 个缩略图,无论长度如何:

ffmpeg -i video.mp4 -ss 00:00:05 -vf select="eq(pict_type\\,I)[s1];[s1]showinfo[out]" -vframes 1 -q:v 1 thumbs/thumb-1.jpg 2>&1
Run Code Online (Sandbox Code Playgroud)

目的是获得我正在寻找的秒数中最近的 iframe,例如找到靠近 5 秒标记的最近的 iframe 并获取缩略图 - 这会提高性能。

问题是,ffmpeg 输出看似随机的 pts_time,与 ffprobe 中显示的 pkt_pts_time 相比绝对不正确。

正如标题所述,我正在寻找一个 ffmpeg 命令来在最接近指定搜索的 iframe 处生成缩略图,并获取时间戳。

aer*_*tal 5

您现在执行此操作的方式在您寻求输出时并不是最佳的,也就是说,输入视频会被解码并丢弃,直到您到达搜索标记。

执行此操作的最佳方法是通过输入查找,即将参数放在-ss输入之前-i并使用-noaccurate_seek选项。通过这种方式,使用关键帧来解析输入,而不是解码

因此,它会寻找时间戳之前最近的关键帧,然后您可以将其保存到图像中。请参阅 wiki了解更多信息。

ffmpeg -noaccurate_seek -ss 00:00:05 -i video.mp4 \
-vf select="eq(pict_type\\,I)[s1];[s1]showinfo[out]" \
-vframes 1 -q:v 1 thumbs/thumb-1.jpg
Run Code Online (Sandbox Code Playgroud)