Mec*_*cki 5 media algorithm audio video
这可能是一个太笼统的问题,但是如果数据具有可变比特率(VBR),那么在媒体文件(任何类型/格式的视频或音频)中查找的一般方法是什么?
如果流具有恒定的比特率 (CBR),这似乎是一件容易的事情。例如,如果您知道它是 256 kbit/s 并且您想向前/向后查找 30 秒,只需计算(大约)有多少位,将其转换为字节并在文件中向前/向后查找那么多字节。最后继续阅读和解析,直到找到下一个标题/块开始/关键帧/任何内容,然后从那里继续播放。
好的,但是如果比特率变化很大怎么办?例如,它可以是 32 到 512 kbit/s 之间的任何值,并且经常变化?我知道这可能取决于音频/视频格式。某些文件格式在您可能使用的开头/结尾处具有索引表,并且某些文件在流中包含指针以跳过接下来的 X 秒以跳过多少字节。在这种情况下,您可以使用该信息,但是,如果该格式没有这样的表或指针怎么办?
我能想到的最天真的方法是尽可能好地估计比特率(例如,通过查看播放的最后几秒的平均比特率),根据估计的比特率跳转到您认为正确的位置,看看你到底跳了多远。如果跳得太多,请尝试向后跳一点。如果你跳得太少,请尝试向前跳一点。也许继续向一个方向跳跃,直到再次跳得太远,现在再次反转方向以及步长(类似于二分搜索算法)。每次你跳得太远,你就会反转方向并减小步长。您将越来越接近正确的点,如果您足够接近(低于某些选定的增量),只需重新开始播放(毕竟跳跃不必精确到毫秒)。
虽然上面的算法可能有效,但听起来相当糟糕,并且在实践中可能非常慢。那么它到底是如何做到的呢?有人写过某种媒体播放器/播放器插件吗?或者就像这样,如果希望软件能够正确查找而不只是从头到尾播放,那么每个支持 VBR 的“体面”格式都必须在流中具有某种索引表或跳过指针?
这正是 DVD 使用 VOB 文件而不是原始比特流的原因。使用 VOB 文件,您不仅可以获得比特流本身,还可以获得指向连续帧的指针,因此您可以快速轻松地跳到另一帧。
OTOH,大多数视频比特流的设计使得同步和找到帧的开头相当容易(对于广播电视之类的东西来说是必需的),因此估计(和向下舍入),然后搜索帧的开头也相当有效。许多还对可接受的最大压缩率有限制,因此仔细估计可以使您相当接近帧的开头。