【问题标题】:Getting Intra-Frames from a video从视频中获取帧内帧
【发布时间】: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 以避免多余的图片。

标签: video ffmpeg


【解决方案1】:

一般意义上,不,这样的库是不存在的。但是,如果您根据您处理的特定视频做出假设,您可以近似得出结果。 FFmpeg 无法为您做到这一点,因为它是一个通用框架。

让我们从简单的开始:

  • 您的视频是什么容器?
  • 他们使用什么编解码器?

我为什么要问这个?某些容器(例如 AVI)在索引中标记帧类型,因此您无需对压缩帧执行任何操作即可获取所需信息。对于其他容器(例如 Matroska/WebM),信息严格来说不是容器的一部分,但存在衍生信息。例如,对于非仅内部的压缩流(例如 H.264/VP9),seekHead 实际上是关键帧位置的列表,其范围类似于 AVI 文件中的索引。但这不是规范所保证的,只是在实践中恰好是真的。

好的,假设容器不足以满足您的目的。您需要自己解析视频数据。对于 H.264,您可以解析每帧中第一个切片的切片标头以获取切片类型。规范保证所有后续切片(对于同一字段)具有相同的切片类型。这可能是 I、B 或 P。如果是 I,则它是帧内。对于 VP9,标头具有称为关键帧和内部的字段,它们可以满足您的需求。其他压缩标准(MPEG-1/2/4、HEVC、VP8 等)是相同的,但您需要自己实现。它并不复杂,但没有通用框架可以为您执行此操作,因为它是一个非常不明显的用例。

【讨论】:

  • 我们有 mp4 容器,但不幸的是视频之间存在很多差异,因为它们是用户提交的,这就是为什么我不想直接解析格式的原因。让我编辑问题以解释最终目标,也许会弹出其他解决方案。
  • mp4 也有关键帧标记,所以应该可以正常工作。请参阅 libavformat/mov.c 中的“sc->keyframes[]”以及如何在索引中设置 AVINDEX_KEYFRAME。该索引是在 read_header() 期间生成的,因此应该可以从 ffmpeg API 访问它,而无需编写自己的 mp4 解析器,并且仍然与编解码器无关。
  • 这很有趣。我正在调查这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
相关资源
最近更新 更多