我正在研究一种算法,该算法需要非常快速地随机访问可能很长的视频(至少 30 分钟)中的视频帧。我目前正在使用 OpenCV 的 VideoCapture 来阅读我的视频,但是搜索功能要么坏了要么很慢。到目前为止,我发现的最好的方法是在 MKV 容器中使用 MJPEG 编解码器,但速度还不够快。
我可以选择任何视频格式,甚至可以创建一个新格式。存储空间不是问题(当然在某种程度上)。唯一的要求是尽可能快地搜索视频中的任何位置。理想情况下,我希望能够同时访问多个帧,利用我的四核 CPU。
我知道关系数据库非常适合存储大量数据,它们允许同时读取访问,并且在使用索引时速度非常快。
SQLite 是否适合我的特定需求?我计划以 JPEG 格式存储每个视频帧,并使用帧号索引来快速访问它们。
编辑:对我来说,一帧只是一个图像,而不是整个视频。一个 25 fps 的 3000 万视频包含 30*60*25=45000 帧,我希望能够使用它的数量快速获得其中一个。
编辑:对于那些可能感兴趣的人,我最终实现了一个自定义视频容器,将每个帧保存在固定大小的块中(因此,可以直接计算任何帧的位置!)。图像使用 turbojpeg 库压缩,文件访问是多线程的(对 NCQ 友好)。瓶颈不再是硬盘驱动器了,我终于获得了更好的性能:)