可查找电影格式的C/C++库

可查找电影格式的C/C++库,c++,c,file-format,video-encoding,C++,C,File Format,Video Encoding,我正在对一些非常大的视频文件(通常高达16MP)进行处理,我需要一种方法来存储这些视频,以允许查找特定帧而不是时间,如ffmpeg。我正计划滚动我自己的格式,将所有单独的zlib压缩帧连接在一起,然后在末尾附加一个索引,将帧编号链接到文件字节索引。在我开始之前,我只是想检查一下,确保我没有复制其他格式/库的功能。有人听说过允许无损压缩和随机访问视频的格式/库吗?有些格式允许您更改每秒的关键帧数 例如,我使用ffmpeg以每秒25帧、每秒25个关键帧的速度编码到flv,然后使用一个可以很好地移动到

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

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

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

我上次检查quicktime时,也可以逐帧搜索,而不必将每一帧都作为关键帧


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

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

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

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

如果存在空间问题,则p帧依赖于前一帧/帧可以大大减小文件的大小。我不会因为B帧依赖于以前和将来的帧/帧而弄乱它,因为它们使事情变得更加困难


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

我可能完全错了,但是你不能根据每秒的帧数和你想要跳转到的帧来计算期望跳转到的时间吗?我这样做是为了科学,所以我不能通过有损编解码器丢失任何图像信息,而且我不能冒险跳转到错误的帧,即使是从目标帧跳转到+1或-1帧-据我所见,大多数视频库(如ffmpeg)只会尽最大努力让您获得所需的帧,并且缺乏我所需的准确度。这是一种非常非标准的视频存储方式。所有现有的格式都使用帧间压缩来保持数据速率要求的合理性。你找不到任何对你有帮助的东西。这就是我需要听到的,汉斯-谢谢你。如果你把它作为一个答案,我很乐意接受。