【发布时间】:2013-03-07 15:50:10
【问题描述】:
我有一个视频文件,它由许多连续的二进制数据帧组成。每帧也有一个唯一的时间戳(不是它在文件中的序号,而是一个值,由相机在录制时提供)。另一方面,我有一个 API 函数,它根据该帧的序号检索该帧。让事情变得更复杂一些 - 我有一个玩家,它被提供了时间戳,并且应该获取该帧的二进制数据。
这里还有一件可悲的事情:时间戳不是连续的。它们可以是连续的,但不能保证,因为围绕最大无符号短大小可能会发生回绕。
所以一系列时间戳可以是
54567, 54568, ... , 65535, 65536 , ... 或
54567, 54568, ..., 65535, 0, 1, ...
所以它可能如下所示:
Frame 0
timestamp 54567
binary data
........
Frame 1
timestamp 54569
binary data
........
Frame 2
timestamp 54579
binary data
.
.
.
Frame n
timestamp m
binary data
0 <= n <= 65536 (MAX_UNSIGNED_SHORT)
0 <= m <= MAX_UNSIGNED_INT
剪辑播放器 API 应该能够通过时间戳获取二进制帧。但是,在内部,我只能通过帧序号来获取帧。因此,如果我被要求提供时间戳m,我需要遍历n 帧,以找到时间戳m 的帧。
为了优化它,我选择创建一个索引文件,它可以让我在时间戳和帧序号之间进行匹配。这是我的问题:
目前我的索引文件由大小为2*sizeof(unsigned int) 的二进制对组成,其中包含时间戳和帧序号。播放器稍后会从该文件 stl map 和 key==timestamp、value==frame sequential number 创建。
有什么方法可以提高效率吗?我是否应该将索引文件创建为某些数据结构的转储,以便以后可以在打开剪辑时由剪辑播放器将其加载到内存中,这样我就可以 O(1) 访问帧?您还有其他建议吗?
更新:
我已经更新了名称和要求(时间戳不一定是连续的,并且帧数由 MAX_UNSIGNED_SHORT 值限制)。还要感谢所有已经抽出时间并给出答案的人。插值搜索是一个有趣的想法,尽管我自己从未尝试过。我想问题是运行时O(1) 和O(log log N) 之间的增量。
【问题讨论】:
-
两者之间没有相关性(除了它们都在严格增加之外)?
-
我猜“帧索引”是时间戳?不会严格影响您将获得的答案,但名称有点笨拙。您可能会在公开的Matroska specification 中找到一些有用的信息
-
“帧索引”可以被认为是一个“时间戳”。我同意这些不是选择的最佳名称:(
标签: c++ performance data-structures big-o video-capture