电影中有多少帧?
原文链接: 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 中使视频处理变得简单直接。 随着我对视频处理了解的深入,我会发布更多处理视频的例子!