这可能是一个过于笼统的问题,但是如果数据具有可变比特率(VBR),则在媒体文件(任何类型/格式的视频或音频)中进行搜索的一般方法是什么?

如果流具有恒定的比特率(CBR),这似乎很容易。例如。如果您知道它是256 kbit / s,并且想在30秒内向前/向后搜索,则只需计算(大约)多少位,将其转换为字节,然后在文件中查找向前/向后的字节数即可。最后继续阅读和解析,直到找到下一个 header /块开始/关键帧/任何内容,然后从那里继续播放。

好的,但是如果比特率变化很大,该怎么办?例如。它可以是32到512 kbit / s,并且经常变化吗?我知道这可能取决于音频/视频格式。某些文件格式在您可能会使用的开头/结尾处都有索引表,而某些文件在流中包含的指针将为跳过接下来的X秒而跳过多少字节。在那种情况下,您可以使用该信息,但是,如果格式没有此类表或指针,该怎么办?

我能想到的最幼稚的方法是尽可能地估计比特率(例如,通过查看播放的最后几秒钟的平均比特率),根据估计的比特率跳到您认为正确的位置,然后看看您真正跳了多远。如果跳得太多,请尝试向后跳一点。如果跳得太少,请尝试向前跳一点。也许一直沿一个方向跳,直到您再次跳得太远,现在又将方向和步长反转(类似于二进制搜索算法)。每次跳得太远,都会反转方向并减小步长。您会越来越接近正确的点,如果您足够接近(在某些选定的增量以下),则只需再次开始播放(毕竟所有的跳变都不必精确到毫秒)。

尽管上面的算法可能有效,但听起来很差,实践中可能很慢。那到底是怎么做的呢?有人写过某种媒体播放器/播放器插件吗?还是这样,如果每个支持VBR的“体面”格式都必须在流中具有某种索引表或跳过指针,如果它希望软件能够正确地寻找而不只是从头到尾播放的话?

最佳答案

这正是(例如)DVD使用VOB文件而不使用原始比特流的原因。使用VOB文件,您不仅可以获取比特流本身,还可以获取指向连续帧的指针,因此您可以轻松快捷地跳至另一帧。

OTOH,大多数视频比特流都是经过设计的,因此可以很容易地进行同步和找到帧的开始(对于广播电视来说是必需的),因此进行估算(并四舍五入)然后搜索帧开始也相当有效。许多压缩器都对可接受的最大压缩率也有限制,因此仔细估算可以使您合理地接近帧的开始。

关于algorithm - 如何寻找可变比特率(VBR)的音频/视频数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2088348/

10-09 08:02