这可能是一个过于笼统的问题,但如果数据具有可变比特率(VBR),那么在媒体文件(任何类型/格式的视频或音频)中搜索的一般方法是什么?
如果流具有恒定比特率(CBR),这似乎很容易。例如。如果您知道它是256 kbit / s并且您想要向前/向后搜索30秒,那么只需计算(大约)多少位,将其转换为字节并在文件中向前/向后搜索那么多字节。最后继续阅读和解析直到下一个标题/块开始/关键帧/找不到任何内容并从那里继续播放。
好的,但如果比特率变化很大,你会怎么做?例如。它可以是32到512 kbit / s的任何东西并且经常变化?我知道这可能取决于音频/视频格式。某些文件格式在您可能使用的开头/结尾处具有索引表,并且某些文件在流中包含指针,以跳过下一个X秒跳过多少字节。在这种情况下,您可以使用该信息,但是,如果格式没有这样的表或指针,该怎么办?
我能想到的最天真的方法是尽可能地估计比特率(例如,通过查看你回放的最后几秒的平均比特率),跳到你认为可能正确的位置根据估计比特率,看看你真正跳得多远。如果你跳得太多,试试跳一下。如果你跳得太少,请尝试向前跳一下。也许继续向一个方向跳跃,直到你再次跳得太远,现在再次反转方向以及步长(类似于二进制搜索算法)。每次跳得太远,都会反转方向并减小步长。您将越来越接近正确的点,如果您足够接近(低于某个选定的增量),只需再次开始播放(在所有跳转不必精确到毫秒之后)。
虽然上面的算法可能有效,但听起来相当差,在实践中可能非常慢。那怎么回事呢?有没有人写过某种媒体播放器/播放器插件?或者就是这样,支持VBR的每个“体面”格式必须有一些索引表或跳过指针,如果它希望软件正确搜索而不仅仅是从头到尾播放?
答案 0 :(得分:2)
这正是(例如)DVD使用VOB文件而不是原始比特流的原因。使用VOB文件,您不仅可以获得比特流本身,还可以获得连续帧的指针,因此您可以快速轻松地跳到另一帧。
OTOH,大多数视频比特流是设计的,所以它很容易同步并找到一个帧的开头(广播电视之类的必要),所以估计(和舍入),然后搜索对于框架开始工作也相当好。许多人也对可接受的最大压缩率有限制,因此仔细估算可以让你合理地接近帧的开头。
答案 1 :(得分:2)
您描述的二进制搜索算法或多或少是seeking in Ogg Vorbis files work。我从未见过其他格式使用它,大多数都使用某种索引结构进行搜索。
答案 2 :(得分:1)
您可以在开头将粗索引存储到文件中,并在文件中包含固定数量的搜索点的位置。在每个这样的搜索点,您可以在文件的该部分内存储搜索点的子索引,依此类推。您可以将其视为一种B +树,但节点存储在它们索引的数据之前。
我不知道是否有人真的这样做,但它应该比你描述的二进制搜索快得多,特别是如果每次搜索都是机械的,因此很慢。