【发布时间】:2010-01-19 04:15:08
【问题描述】:
这可能是一个过于笼统的问题,但是如果数据具有可变比特率 (VBR),那么在媒体文件(任何种类/格式的视频或音频)中寻找的一般方法是什么?
如果流具有恒定比特率 (CBR),这似乎很容易。例如。如果您知道它是 256 kbit/s 并且您想向前/向后搜索 30 秒,只需计算(大约)多少位,将其转换为字节并在文件中向前/向后搜索那么多字节。最后继续读取和解析,直到找到下一个 header/block-start/keyframe/whatever 并从那里继续播放。
好的,但是如果比特率变化很大,你会怎么做?例如。它可以是从 32 到 512 kbit/s 的任何值,并且经常变化?我知道这可能取决于音频/视频格式。某些文件格式在您可能使用的开头/结尾处具有索引表,并且某些文件在流中包含指针,要跳过多少字节以跳过接下来的 X 秒。在这种情况下,您可以使用该信息,但是,如果格式没有此类表或指针怎么办?
我能想到的最幼稚的方法是尽可能地估计比特率(例如,通过查看您播放的最后几秒钟的平均比特率),根据您认为可能正确的地方跳转估计的比特率,看看你真的跳了多远。如果你跳得太多,试着往后跳一点。如果你跳得太少,试着向前跳一点。也许继续向一个方向跳跃,直到你再次跳得太远,现在再次反转方向以及步长(类似于二进制搜索算法)。每次跳得太远时,您都会反转方向并减小步长。您将越来越接近正确的点,如果您足够接近(低于某个选定的增量),只需重新开始播放(毕竟跳跃不必精确到毫秒)。
虽然上面的算法可能有效,但它听起来很糟糕,并且在实践中可能非常慢。那么它是如何真正做到的呢?有人写过某种媒体播放器/播放器插件吗?或者如果它期望软件正确地寻找而不只是从头到尾播放,那么每个支持 VBR 的“体面”格式都必须在流中具有某种索引表或跳过指针是这样吗?
【问题讨论】:
-
我有点困惑。如果您执行“跳跃”并且之后您可以查看您跳跃的位置,那么您已经在使用播放器了,不是吗?我使用 BASS 库,它允许我“跳跃”并检查当前的播放时间。据我所知,所有有跳跃概念的播放器和库都允许你指定时间。所以有什么问题?我在那里遗漏了一些东西。
标签: algorithm video audio media