私は、おそらく長いビデオ(最低30分)のビデオフレームへの非常に高速なランダムアクセスを必要とするアルゴリズムに取り組んでいます。現在、OpenCVのVideoCaptureを使用してビデオを読んでいますが、シーク機能が壊れているか、非常に遅いです。これまで私が見つけた最高のものは、MKVコンテナ内でMJPEGコーデックを使用することですが、十分な速度ではありません。
任意のビデオ形式を選択することも、新しい形式を作成することもできます。収納スペースは問題ありません(もちろんある程度)。唯一の要件は、ビデオ内の任意の場所への可能な限り最速のシーク時間を取得することです。理想的には、クアッドコアCPUを利用して、複数のフレームに同時にアクセスできるようにしたいと考えています。
リレーショナルデータベースは大量のデータを格納するのに非常に優れており、同時読み取りアクセスが可能であり、インデックスを使用する場合は非常に高速です。
SQLiteは私の特定のニーズに適していますか?各ビデオフレームをJPEGで圧縮して保存し、フレーム番号のインデックスを使用してすばやくアクセスする予定です。
編集:私にとって、フレームは単なる画像であり、ビデオ全体ではありません。30分ビデオ@25fpsには、30 * 60 * 25 = 45000フレームが含まれています。その番号を使用して、そのうちの1つをすばやく取得できるようにしたいと思います。
編集:興味がある人のために、私は最終的に各フレームを固定サイズのブロックに保存するカスタムビデオコンテナを実装しました(したがって、任意のフレームの位置を直接計算できます!)。画像はturbojpegライブラリで圧縮され、ファイルアクセスはマルチスレッド化されます(NCQに対応するため)。ボトルネックはもうHDDではなく、私はついにはるかに優れたパフォーマンスを手に入れました:)