0

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

4

2 回答 2

0

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

例如,我使用 ffmpeg 以每秒 25 帧和每秒 25 个关键帧的速度编码为 flv,然后使用一个可以很好地移动到关键帧的播放器。基本上,这让我可以逐帧搜索。

此外,我上次检查 quicktime 时可以逐帧搜索,而不必让每一帧都成为关键帧。

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

于 2010-04-15T17:28:00.513 回答
0

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

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

如果空间不是很重要,我建议像你说的那样做,但是使用 JPEG 压缩而不是 zlib,因为它利用了你正在处理图像数据的事实,它会给你更高的压缩率。

如果空间是一个问题,P 帧(取决于以前的帧/帧)可以大大减小文件的大小。我不会弄乱 B 帧(取决于以前和将来的帧/帧),因为它们使事情变得更难。

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

于 2010-04-15T17:45:32.540 回答