从视频中获取框架



首先,让我序言,说我必须处理大量视频,并且每个视频甚至剃光1秒都非常重要。

我正在尝试提取视频中所有内部框架的位置。

ffprobe有效,但速度非常慢。

ffmpeg工作速度要快得多,但仍然很慢。

所以,我的问题是是否有lib,我可以在其中做类似伪代码的事情:

var frame = first_frame;
do
{
    if (frame.type == intra_frame) log(frame.time);
    frame = frame.next;
} while (frame != null);

并非常快速地通过视频扫描,而不是在框架内部查看任何内容,而只是找到框架类型并继续进行下一个标题。

最终目标是尽可能快地生成胶卷,以进行预览。我需要生成48个缩略图在电影中大致均匀地散布并介绍整个电影跨度(不包括每端5秒(。我希望通过仅提取框架内的框架来加快过程。由于我需要固定数量的缩略图,因此我只能通过知道框架内的总量来做到这一点。

此情况仅在找到所有框架内索引和提取48个Intra框架的时间仅在单个通过时(定期间隔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是否更快?

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

让我们开始简单:

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

我为什么要问这个?索引中的一些容器(例如AVI(标记框架类型,因此您无需使用压缩框架做任何事情即可获取所需的信息。对于其他容器(例如Matroska/WebM(,该信息并不是严格的容器的一部分,而是存在派生信息。例如,对于不仅限内部的压缩流(例如H.264/vp9(,Seekhead在实践中是一个关键帧位置列表,与AVI文件中的索引相似。但这不能由规格保证,在实践中恰好是真实的。

好吧,假设容器不足以实现您的目的。您需要自己解析视频数据。对于H.264,您可以在每个框架中第一个切片的切片标头进行分析以获取切片类型。规格具有相同的切片类型,可以保证所有以下切片(对于同一字段(。这可能是我,b或P。如果是我,那是一个内部框架。对于VP9,标题具有称为KeyFrame的字段,并且内部可以执行您的需求。其他压缩标准(MPEG-1/2/4,HEVC,VP8等(是相同的,但是您需要自己实施。它并不复杂,但是没有通用的框架可以为您做到这一点,因为它是一个非常不太明显的用例。

最新更新