web-dev-qa-db-fra.com

Encodage OpenCV en H264

Je veux encoder des images en vidéo H264 dans OpenCV.

Dans le cadre de mon logiciel de suivi d'image, j'utilise VideoWriter dans OpenCV 3.4 (64 bits) avec Visual Studio 2017 C++. J'utilise ffmpeg pour l'encodage manuel, et comme il est livré avec OpenCV, je suppose que c'est la meilleure option. Ma version d'OpenCV indique qu'il a été compilé avec ffmpeg, et je peux vérifier qu'il charge le opencv_ffmpeg340_64.dll.

Le décodage H264 (AVC1) est tout à fait correct, y compris lors de l'utilisation spécifique de l'API ffmpeg. Mais encoder autre chose que MJPG ou des images brutes ne fonctionne pas: VideoWriter.Open () renvoie principalement false, dans certains cas, il écrit uniquement un en-tête vide ou petit mais n'écrit pas de trames. J'ai essayé non seulement l'API ffmpeg, mais aussi toute API disponible. Rediriger la sortie de la console/débogage vers la fenêtre intermédiaire dans VC ne donne aucun message d'OpenCV ou de ffmpeg.

Il existe de nombreux articles sur les versions précédentes d'OpenCV utilisant FFmpeg, y compris la bibliothèque (Cisco) OpenH264 et les difficultés d'utilisation. J'ai essayé de nombreuses options, en installant le pack de codecs, y compris H264, la version statique de ffmpeg, la bibliothèque Cisco openH264, la définition de chemins, etc. MP4) ainsi que des cordes fourcc.

Je ne peux pas croire en 2018 que le grand OpenCV avec prise en charge FFmpeg ne soit pas en mesure de coder autre chose qu'un MJPG obscur ou des images brutes. S'il utilise FFmpeg, un ensemble important de fonctionnalités devrait sûrement être disponible?

Bien que je pense que cela devrait fonctionner, ma prochaine meilleure option serait d'utiliser une bibliothèque ffmpeg distincte, ce qui ajouterait ironiquement un autre ffmpeg.dll à ma solution, j'imagine. Toute suggestion appréciée!

Fragment de code (en utilisant n'importe quelle API d'encodage vidéo):

VideoWriter writer;
int codec = VideoWriter::fourcc('X', '2', '6', '4');
writer.open("test.avi", codec, 30, colorImage.size(), true);
writer.write(colorImage);
writer.release();
6
Yost777

Pour répondre à ma propre question - merci pour les suggestions précédentes - j'ai réussi à créer et à écrire des images sur la vidéo H264 maintenant, sans aucune recompilation nécessaire. Voici ce que j'ai utilisé:

  • Utilisation d'OpenCV version 3.4.1
  • Dans le même dossier que l'exe: opencv_ffmpeg341_64.dll (fourni avec OpenCV)
  • Dans le même dossier: openh264-1.7.0-win64.dll (disponible sur: https://github.com/Cisco/openh264/releases )
  • Utilisez la classe OpenCV VideoWriter, en omettant une API d'encodage spécifique
  • Conteneur: MP4
  • Chaîne de codec fourcc: "H264"

J'ai formaté ma machine (Windows 10 64 bits), donc je ne peux exclure aucun problème de conflit de codec potentiel - je n'ai pas non plus testé complètement d'autres combinaisons. Comme cela semble être un problème si courant (avec de nombreuses idées fausses), j'espère que cela sera utile.

7
Yost777