c++ - 用于可查找电影格式的 C/C++ 库

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

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

最佳答案

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

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

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

如果空间是一个问题,P 帧(取决于之前的帧)可以大大减小文件的大小。我不会搞乱 B 帧(取决于之前和 future 的帧),因为它们让事情变得正确变得更加困难。

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

关于c++ - 用于可查找电影格式的 C/C++ 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2647455/

相关文章:

c - 无法理解格式字符串利用代码

c++ - 说明用 C++ 编写抽象层的简单示例

c++ - 从 Boost C++ 库构建特定的库

c++ - 使用 C++ header 的简单 C 程序中的链接错误

c++ - 在 Emacs for C++ 中更改制表符空间和热键

c++ - XML 文件格式中的 bool 值应该写成 true/false 还是 1/0?

c - 从 header 中读取 sh_name 每次都会返回一个值

c - 检测到 glibc - 双重释放或损坏 (!prev)

.net - 有没有人知道现有的代码来读取 mork 文件(Thunderbird 地址簿)?

python - 我怎么能在不使用魔数(Magic Number)的情况下说文件是 SVG?