Je travaille sur un algorithme qui nécessite un accès aléatoire très rapide aux images vidéo dans une vidéo éventuellement longue (minimum 30 minutes). J'utilise actuellement VideoCapture d'OpenCV pour lire ma vidéo, mais la fonctionnalité de recherche est cassée ou très lente. Le meilleur que j'ai trouvé jusqu'ici est d'utiliser le codec MJPEG dans un conteneur MKV, mais ce n'est pas assez rapide.Enregistrer une vidéo dans une base de données SQLite?
Je peux choisir n'importe quel format vidéo ou même en créer un nouveau. L'espace de stockage n'est pas un problème (à certains égards bien sûr). La seule exigence est d'obtenir le temps de recherche le plus rapide possible à n'importe quel endroit de la vidéo. Idéalement, j'aimerais pouvoir accéder simultanément à plusieurs images en profitant de mon processeur quad-core.
Je sais que les bases de données relationnelles sont très bien pour stocker de gros volumes de données, elles permettent des accès en lecture simultanés et elles sont très rapides lors de l'utilisation d'index.
SQLite convient-il à mes besoins spécifiques? Je prévois de stocker chaque image vidéo compressée en JPEG, et d'utiliser un index sur le numéro de la trame pour y accéder rapidement.
EDIT: pour moi un le cadre est juste une image, pas toute la vidéo. Une vidéo de 30mn @ 25 fps contient 30 * 60 * 25 = 45000 images, et je veux être en mesure d'en obtenir rapidement un en utilisant son numéro.
EDIT: Pour ceux qui pourraient être intéressés, j'ai finalement implémenté un conteneur vidéo personnalisé en sauvegardant chaque image dans des blocs de taille fixe (par conséquent, la position de n'importe quelle image peut être directement calculée!). Les images sont compressées avec la bibliothèque turbojpeg et les accès aux fichiers sont multi-threadés (pour être compatibles NCQ). Le goulot d'étranglement n'est plus le disque dur et j'ai finalement obtenu beaucoup mieux perfs :)
@Cicada: il n'y a aucune limite sur la taille de la vidéo. Pour l'instant, je travaille sur une vidéo VGA 30mn (500 Mo en MPEG, 1,7 Go en MJPEG), mais le programme est censé fonctionner sur 5 heures de vidéo. Que voulez-vous dire par "système de fichiers"? J'ai besoin de traiter la requête comme "get frame 1530" aussi vite que possible. Utiliser une base de données est une suggestion, si vous avez une meilleure idée, je suis ouvert! –
SQLite a une limite intégrée de 1 Go (953 Mio) par BLOB, donc chacune de vos images séparées ne peut pas être plus grande que cela. Ce que je veux dire, c'est pourquoi ne pas stocker des cadres directement sous forme de fichiers? Une base de données n'est pas adaptée à ce que vous essayez de faire. –
@Cicada: Peut-être que j'ai utilisé la mauvaise formulation (je ne suis pas anglais natif). Pour moi, un cadre est juste une image, donc il ne sera pas plus grand que 1 Mo. Une vidéo de 30mn à 25 ips contient 30 * 60 * 25 = 45000 images. Une vidéo de 5h nécessiterait 450 000 fichiers, je ne pense pas que ce soit une bonne solution. –