【发布时间】:2017-06-01 14:09:38
【问题描述】:
首先,让我先说一下,我必须处理大量视频,每个视频甚至减少 1 秒都非常重要。
我正在尝试提取视频中所有帧内帧的位置。
FFProbe 有效,但速度非常慢。
FFMpeg 运行速度更快,但仍然很慢。
所以,我的问题是是否有一个库,我可以在其中执行类似以下伪代码的操作:
var frame = first_frame;
do
{
if (frame.type == intra_frame) log(frame.time);
frame = frame.next;
} while (frame != null);
并快速浏览视频,不查看帧内的任何内容,而只查看标题以查找帧的类型并继续下一个。
最终目标是尽可能快地生成用于预览的幻灯片。我需要生成 48 个缩略图,大致均匀地分布在电影中并覆盖整个电影范围(每端不包括 5 秒)。我希望通过只提取帧内来加快这个过程。由于我需要固定数量的缩略图,我只能通过知道帧内帧的总数来做到这一点。
仅当查找所有帧内索引并提取 48 个帧内帧的时间少于获取帧的时间时,此方案才有效,一次通过,以固定的时间间隔,48 次。
编辑:这是我迄今为止找到的解决方案;在这个例子中,我每分钟拍摄一帧
ffmpeg -hide_banner -skip_frame nokey -i _a.mp4 -vf "select='eq(pict_type\,PICT_TYPE_I)*(lt(abs(t\-30)\,2)+lt(abs(t\-90)\,2)+lt(abs(t\-150)\,2)+lt(abs(t\-180)\,2)+lt(abs(t\-240)\,2)+lt(abs(t\-300)\,2)+lt(abs(t\-360)\,2)+lt(abs(t\-420)\,2))',showinfo,scale=640:480,tile=6x8" -vsync 0 frames.jpg
我发现如果我直接指定帧,我并没有真正得到速度差异。
没有通过 API,FFMPEG 有什么更快的方法吗?
【问题讨论】:
-
您可以启发式地执行此操作。阅读
stss框中的条目数。探测媒体的持续时间。计算粗略的 KF 距离值,以秒为单位。使用带有-skip_frame nokey的ffmpeg 并选择过滤器以提取大致相距那么远的帧。添加-vframes 48以避免多余的图片。