Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何使用可变比特率(VBR)查找音频/视频数据?_Algorithm_Video_Audio_Media - Fatal编程技术网

Algorithm 如何使用可变比特率(VBR)查找音频/视频数据?

Algorithm 如何使用可变比特率(VBR)查找音频/视频数据?,algorithm,video,audio,media,Algorithm,Video,Audio,Media,这可能是一个过于笼统的问题,但如果数据具有可变比特率(VBR),在媒体文件(任何类型/格式的视频或音频)中查找的一般方法是什么 如果流具有恒定比特率(CBR),那么这似乎是一件容易的事情。例如,如果您知道它是256 kbit/s,并且希望向前/向后搜索30秒,只需计算(大约)的位数,将其转换为字节,并在文件中向前/向后搜索该位数。最后,继续阅读和解析,直到找到下一个标题/块开始/关键帧/任何内容,并从那里继续播放 好的,但是如果比特率是高度可变的,你会怎么做?例如,它可以是32到512 kbit

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

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

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

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

虽然上述算法可能有效,但它听起来相当糟糕,在实践中可能非常缓慢。那么它到底是如何做到的呢?有人写过某种媒体播放器/播放器插件吗?或者,如果希望软件正确地查找而不是从头到尾播放,那么每个支持VBR的“体面”格式流中都必须有某种索引表或跳过指针,这就是为什么(例如)DVD使用VOB文件而不是原始比特流的原因。使用VOB文件,您不仅可以获得比特流本身,还可以获得指向连续帧的指针,因此您可以快速轻松地跳到另一帧


OTOH,大多数视频比特流的设计使得同步和查找帧的开始(对于广播电视之类的事情来说是必要的)相当容易,因此估计(并向下舍入),然后搜索帧的开始也相当有效。许多还对可接受的最大压缩率有限制,因此仔细估计可以使您合理地接近帧的开头。

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


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

你描述的二进制搜索算法或多或少是如何实现的。我从未见过其他格式使用它,大多数使用某种索引结构进行查找。

同步是一回事,在文件中找到正确的位置是另一种。VBR的问题是,当我跳转到文件的中间时,我可能接近媒体的中间,或接近开始或接近结束,这取决于比特率的变化程度。我可以快速同步的事实只会很快告诉我,我跳错了位置。而且总是从文件的开头开始按我的方式工作,即使我可以快速跳过帧,也没有那么快(特别是从CD或网络读取数据时)。@Mecki:直接跳到你想要的点肯定快得多。易于同步非常有用,主要是因为它可以让您快速找到自己的位置,因此即使您可能在错误的位置,至少也可以快速轻松地发现您在错误的位置,再找一个合适的地方。因为这是目前为止最好的答案,我也没有比任何人都能想出更好的答案的希望,所以我决定接受它。这不是我希望看到的答案,但绝对是有价值的信息,因为我不知道是这样的+谢谢你和我们分享这些信息。这听起来像个主意。与每次寻道的长延迟不同,这将在开始时导致短延迟(创建索引),但由于该索引,以后的寻道速度会快得多。在HD上可以很好地处理文件,在HD上你可以真正随机访问-在CD/DVD这样的慢查找媒体上效果更差,当然在通过(可能非常慢的)网络访问数据时效果更差。我有点困惑。如果你做了“跳跃”,然后你可以看到你跳的地方,那么你已经在使用玩家了,不是吗?我使用BASS库,允许我“跳转”并检查当前播放时间。据我所知,所有具有跳跃概念的播放器和库都允许您指定时间。那么,有什么问题?我错过了一些东西。