跳转至

电影中有多少帧?

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/how-many-frames-are-in-a-movie

19704 评价本文:

暂无评价

电影中有多少帧?

匿名 2013年6月20日,星期四

在 IDL 8.2.3 版本中,我们通过 IDLffVideoRead 类和 READ_VIDEO 函数引入了视频读取功能,以补充自 IDL 8.1 以来就具备的视频写入功能。我对于将视频作为一种数据格式来使用还是个新手,所以我想发布一个最近学到的一些有趣内容的例子。

我们在 IDL 分发包中包含了一段来自 NASA 的 SDO 和 SOHO 航天器观测到的日冕物质抛射视频:

IDL> video_file = file_which('CME.mp4')

这个视频文件中有多少帧呢?答案并不像我想的那么简单。 从 QUERY_VIDEO 开始,它可以返回一个包含视频文件信息的结构体:

IDL> !null = query_video(video_file, video_info)

IDL> print, video_info.num_frames

         574

文件中有 574 帧。但是等等,让我们尝试用 READ_VIDEO 将整个文件读入 IDL:

IDL> movie = read_video(video_file, /all)

IDL> help, movie

MOVIE           BYTE      = Array[3, 512, 288, 564]

READ_VIDEO 将帧作为像素交错的 RGB 图像返回。所以我想文件中只有 564 帧? 让我们转向 IDLffVideoRead 提供的底层 API,看看它是否能提供不同的信息。GetStreams 方法提供了文件中单一视频流的信息:

IDL> v = idlffvideoread(video_file)

IDL> print, (v.getstreams()).count

         574

如果你查看 QUERY_VIDEO 的源代码,你会发现它正是使用这种技术来返回帧数的。但是,如果遍历文件,逐帧读取,直到文件结束呢?这段代码块:

   i = 0

   repeat begin

      data = v.getnext(type=t)

      ++i

   endrep until t eq -1

就是这样做的。结果是:

IDL> print, --i

         564

好吧,为什么视频文件的帧数有两个不同的值?我请教了 IDL 团队的一位工程师 Andrew Magill,他在视频方面的知识远比我丰富。他给出了两种可能性:

有可能是 FFmpeg 实际上事先并不知道有多少帧。来自 ::GetStreams 的数字可能是基于视频长度、帧率、文件大小等估算出来的。或者也许实际上有 574 帧,但最后 9 帧无法解码。

Andrew 还提供了一些我没有包含在内的技术细节,并指出这些可能不是唯一的原因。此外,我认为他的总结很有启发性:

不幸的是,视频技术充满了这类小技术难题,而且似乎充满了只能用“嗯,视情况而定”来回答的问题。 FFmpeg 有时看起来真的不太一致,但我认为他们已经做出了巨大的努力,使得所有这些不同的标准能够几乎完全相同地工作。

我希望通过 Andrew 的工作和 FFmpeg 的力量,我们能在 IDL 中使视频处理变得简单直接。 随着我对视频处理了解的深入,我会发布更多处理视频的例子!

图像分析:充分利用您在海岸的时间 谷歌如何为 Google 地图获取准确的地理信息?