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