用于可搜索电影格式的C / C ++库

时间:2010-04-15 17:13:24

标签: c++ c file-format video-encoding

我正在对一些非常大的视频文件(通常高达16MP)进行一些处理,我需要一种方法来存储这些视频的格式允许寻找特定的帧(而不是时间,如ffmpeg)。我计划只是滚动我自己的格式,将所有单独的zlib压缩帧连接在一起,然后在末尾附加一个索引,将帧号与文件字节索引相关联。在我讨论这个之前,我只想检查以确保我没有复制其他格式/库的功能。有没有人听说过允许无损压缩和随机访问视频的格式/库?

2 个答案:

答案 0 :(得分:0)

某些格式允许您更改每秒关键帧的数量。

例如,我使用ffmpeg以每秒25帧的速度编码为flv,每秒25个关键帧,然后使用一个移动到关键帧的播放器。基本上这使我能够逐帧寻找。

同样,我最后一次检查quicktime时,可以逐帧搜索,而不必将每个帧都作为关键帧。

可能不适用于您,但这是我的想法。

答案 1 :(得分:0)

在大多数视频编解码器中难以寻找特定帧的原因是大多数帧依赖于另一帧或帧,因此帧必须作为一组进行解码。出于这个原因,大多数图书馆只会让你寻找最近的I帧(帧内 - 可独立解码的帧)。要从非I帧实际生成图像,需要来自其他帧的数据,因此您必须解码许多帧的数据。

我解决此问题的唯一方法是在文件上创建某种索引。换句话说,在文件中进行传递并创建对应于文件的特定时间或部分的帧的索引。由于大多数库的搜索功能只能寻找I帧,因此您可能必须寻找最近的I帧,然后从那里解码到您想要的确切帧。

如果空间不是很重要,我建议你这样做,但是使用JPEG压缩而不是zlib,因为它会利用你处理图像数据的事实来提高压缩率。 / p>

如果空间有问题,P帧(取决于之前的帧/帧)可以大大减小文件的大小。我不会搞乱B帧(取决于之前和未来的帧/帧),因为它们使得更难以正确处理。

我已经解决了过去使用ffmpeg(libavformat)在存在B帧和P帧的情况下寻找特定帧的问题,以将视频解复用为数据包(每个数据包1帧的数据)并将这些数据连接成一个数据包。单个文件。重要的是保留并索引到该文件,以便您可以找到给定帧的数据包边界。如果帧是I帧,您可以将该帧的数据馈送到ffmpeg解码器中并对其进行解码。如果帧是B帧或P帧,则必须返回到最后的I帧并从那里向前解码。这对于正确的做法来说非常棘手,特别是对于B帧,因为它们的发送顺序通常不同于它们的显示顺序。