将视频存储在 SQLite 数据库中?

Fré*_*oni 3 sqlite video opencv

我正在研究一种算法,该算法需要对可能很长的视频(至少 30 分钟)中的视频帧进行非常快速的随机访问。我目前正在使用 OpenCV 的 VideoCapture 来阅读我的视频,但搜索功能要么坏了要么很慢。到目前为止,我发现最好的方法是在 MKV 容器内使用 MJPEG 编解码器,但速度不够快。

我可以选择任何视频格式,甚至可以创建一个新格式。存储空间不是问题(当然在某种程度上)。唯一的要求是在视频中的任何位置获得尽可能快的搜索时间。理想情况下,我希望能够同时访问多个帧,利用我的四核 CPU。

我知道关系数据库非常适合存储大量数据,它们允许同时读取访问,并且在使用索引时速度非常快。

SQLite 是否适合我的特定需求?我计划将每个视频帧压缩为 JPEG 格式,并使用帧编号上的索引来快速访问它们。

编辑:对我来说,一只是一个图像,而不是整个视频。一个 3000 万视频 @ 25 fps 包含 30*60*25=45000 帧,我希望能够使用其编号快速获取其中一个。

编辑:对于那些可能感兴趣的人,我最终实现了一个自定义视频容器,将每一帧保存在固定大小的块中(因此,可以直接计算任何帧的位置!)。图像使用 turbojpeg 库压缩,文件访问是多线程的(对 NCQ 友好)。瓶颈不再是 HDD,我终于获得了更好的性能 :)

use*_*016 5

我不认为使用 SQLite(或任何其他 dabatase 引擎)是解决您问题的好方法。数据库不是文件系统。

如果您需要非常快速的随机访问,那么坚持使用文件系统,它是为这种用途而设计的,并考虑到这一点进行了优化。根据您的评论,您说 5 小时的视频需要 45 万个文件,嗯,在我看来这不是问题。当然,目录列表会有点长,但您将获得绝对最快的随机访问。它将肯定比SQLite的更快,因为你是在抽象的层次上。

如果您真的担心目录列表时间,您只需像树一样组织您的文件夹结构。这将使您获得更长的路径,但可以快速列出。