【问题标题】:How to Seek Audio/Video Data with Variable Bitrate (VBR)?如何寻找可变比特率 (VBR) 的音频/视频数据?
【发布时间】: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


【解决方案1】:

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

OTOH,大多数视频比特流都是设计的,因此它很容易同步并找到帧的开头(对于广播电视之类的东西是必需的),因此估计(和向下舍入),然后搜索对于一个框架开始也相当不错。许多还对可接受的最大压缩率有限制,因此仔细估计可以让您合理地接近帧的开头。

【讨论】:

  • 嗯,同步是一回事,在文件中找到正确的位置是另一回事。 VBR 的问题在于,当我跳到文件的中间时,我可能会接近媒体的中间,或者接近开头或接近结尾,具体取决于比特率的变化幅度。我可以快速同步的事实只会很快告诉我,我跳到了错误的位置。并且总是从文件的开头开始工作,即使我可以快速跳过帧,仍然不是那么快(尤其是从 CD 或网络读取数据时)。
  • @Mecki:直接跳转到你想要的点肯定要快很多。易于同步很有用,主要是因为它可以让您快速确定您所在的位置,因此即使您可能在错误的位置,至少可以快速轻松地发现您在错误的位置,并再次尝试找到合适的地方。
  • 由于这是迄今为止最好的答案,而且我对任何人都无法提出更好的答案抱有希望,所以我决定接受它。
【解决方案2】:

您描述的二进制搜索算法或多或少是seeking in Ogg Vorbis files work。我从未见过其他格式使用它,大多数使用某种索引结构进行搜索。

【讨论】:

  • 不是我希望看到的答案,但绝对是有价值的信息,因为我不知道是这样的。 +1 与我们分享此信息。
【解决方案3】:

您可以在文件的开头存储一个粗略的索引,其中包含文件中固定数量的查找点的位置。在每个这样的查找点,您可以在文件的该部分中存储查找点的子索引,以此类推。您可以将其视为一种 B+ 树,但节点存储在它们索引的数据之前。

我不知道是否有人真的这样做,但它应该比你描述的二进制搜索快得多,特别是如果每​​次搜索都是机械的,因此很慢。

【讨论】:

  • 这听起来像是个主意。而不是每次查找的长时间延迟,这将导致开始时的短暂延迟(创建索引),但由于该索引,以后的查找会快得多。适用于高清文件,您可以真正随机访问 - 在 CD/DVD 等缓慢搜索媒体上效果更差,当然在通过(可能非常慢)网络访问数据时效果更差。
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多