C'est des années après que la question a été posée, mais j'ai récemment rencontré le genre de problèmes décrits dans cette question ! J'aimerais ajouter ma contribution.
Premièrement:je n'ai construit que les bibliothèques ffmpeg statiques (pour des raisons), auxquelles le processus de construction opencv est quelque peu hostile. Il y a eu des messages de développeurs opencv indiquant qu'ils ne prennent pas en charge une construction opencv contre des bibliothèques ffmpeg statiques, mais ma pensée était "et si vous construisiez également des bibliothèques opencv statiques ? Cela devrait certainement être pris en charge ?"
Et la réponse est oui , vous pouvez compiler des bibliothèques opencv statiques avec des bibliothèques ffmpeg statiques ! Je l'ai fait avec opencv 4.1.1 contre ffmpeg 4.2. J'ai dû utiliser les options cmake suivantes :
cmake3 \
-D BUILD_opencv_apps=OFF \
-D BUILD_opencv_python2=OFF \
-D BUILD_SHARED_LIBS=OFF \
-D WITH_FFMPEG=ON \
-D OPENCV_FFMPEG_SKIP_BUILD_CHECK=ON \
Ces options se traduisent par un ensemble de bibliothèques statiques opencv qui incluent toutes les bibliothèques statiques ffmpeg que vous avez également construites, en supposant que votre PKG_CONFIG_PATH est configuré pour trouver correctement ces bibliothèques (ou si vous les avez installées à un emplacement système par défaut).
Q/R :
- Pourquoi ne pouvons-nous pas créer d'applications ?
- Le processus de construction d'opencv suppose que vous construisez et liez des bibliothèques partagées, même si vous ne construisez que des bibliothèques statiques. Cela semble être une lacune dans le processus de construction plutôt qu'une limitation technique; peut-être qu'un jour cela sera corrigé.
- Qu'est-ce que l'indicateur OPENCV_FFMPEG_SKIP_BUILD_CHECK ?
- Il y a une étape dans le processus cmake de ffmpeg où une application est construite et liée en utilisant le même processus de construction défectueux que les autres applications d'opencv. C'est défectueux dans le sens où le processus suppose que vous vous connectez à des bibliothèques partagées alors qu'il n'en a pas besoin. vous pouvez effectuer vous-même les mêmes étapes de construction alors que pas faire cette hypothèse et créer une application de travail. Ainsi, cette vérification de construction doit être désactivée pour qu'opencv accepte que oui, en fait, toutes les bibliothèques statiques qu'il trouve peuvent être utilisées. C'est
- Et pourquoi désactivez-vous la prise en charge de Python ?
- Le processus de construction opencv python produit explicitement une bibliothèque partagée chargeable par Python.
- Cela implique-t-il que vous construisez toujours la suite de tests même avec les bibliothèques statiques ?
- Oui. Mais je n'ai pas essayé de les exécuter
Quelque chose comme
export LD_LIBRARY_PATH=/ffmpeg_install_path/lib/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/ffmpeg_install_path/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/ffmpeg_install_path/lib/
devrait marcher. Au moins, cela fonctionne pour OpenCV 2.4.x sur mon Ubuntu.
Pour OpenCV 3.x et ffmpeg 3.x, je dois appliquer le patch suivant
diff --git a/cmake/OpenCVFindLibsVideo.cmake b/cmake/OpenCVFindLibsVideo.cmake
index 13b62ac..bab9df3 100644
--- a/cmake/OpenCVFindLibsVideo.cmake
+++ b/cmake/OpenCVFindLibsVideo.cmake
@@ -228,6 +228,12 @@ if(WITH_FFMPEG)
if(FFMPEG_libavresample_FOUND)
ocv_append_build_options(FFMPEG FFMPEG_libavresample)
endif()
+ CHECK_MODULE(libavcodec HAVE_FFMPEG)
+ CHECK_MODULE(libavformat HAVE_FFMPEG)
+ CHECK_MODULE(libavutil HAVE_FFMPEG)
+ CHECK_MODULE(libswscale HAVE_FFMPEG)
+ CHECK_MODULE(libswresample HAVE_FFMPEG)
+ CHECK_MODULE(libavresample HAVE_FFMPEG)
if(HAVE_FFMPEG)
try_compile(__VALID_FFMPEG
"${OpenCV_BINARY_DIR}"
Et avec le script suivant à construire
#!/bin/bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/Applications/ffmpeg/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/Applications/ffmpeg/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$HOME/Applications/ffmpeg/lib
cmake \
-D BUILD_EXAMPLES=ON \
-D BUILD_TESTS=OFF \
-D OPENCV_EXTRA_EXE_LINKER_FLAGS="-Wl,-rpath,$HOME/Applications/ffmpeg/lib" \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$HOME/Applications/opencv \
/path/to/opencv
De plus, lors de la construction de ffmpeg, je dois activer les drapeaux --enable-avresample
.