algorithm - 如何寻找具有可变比特率(VBR)的音频/视频数据?

标签 algorithm video audio media

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

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

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

我能想到的最幼稚的方法是尽可能地估计比特率(例如,通过查看你播放的最后几秒的平均比特率),跳到你认为正确的地方估计的比特率,看看你真正跳了多远。如果你跳得太多,试着向后跳一点。如果你跳得太少,试着向前跳一点。也许继续朝一个方向跳,直到你再次跳得太远,现在再次反转方向以及步长(类似于二进制搜索算法)。每次你跳得太远时,你都会反转方向并减小步长。你会越来越接近正确的点,如果你足够接近(低于某个选定的增量),就重新开始播放(毕竟跳跃不必精确到毫秒)。

虽然上面的算法可能有效,但听起来很差,而且在实践中可能非常慢。那么它是如何真正完成的呢?有人写过某种媒体播放器/播放器插件吗?或者是不是每个支持 VBR 的“体面”格式都必须有某种索引表或流中的跳过指针,如果它希望软件正确地寻找而不只是从头到尾播放?

最佳答案

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

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

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

相关文章:

asp.net - 通过 WinForms 应用程序在网页中实现身份验证

algorithm - 如何获得组合序列中的第 N 个排列,反之亦然?

python - 仅在一个 channel 上生成音频 pyaudio

c++ - 人们实际上使用什么无锁原语在c++中进行无锁音频处理?

Android Native WebRTC 缺少音频 Android 4.4

algorithm - 矢量删除给出意想不到的结果

c++ - 反射格雷码到二进制转换中的魔数(Magic Number)

audio - 录制屏幕视频和音频 - Windows 7

matlab - Matlab中的AVIREAD适合什么样的编码器?

java - Xuggler - 添加音频?