Je to roky poté, co byla otázka položena, ale nedávno jsem narazil na problémy popsané v této otázce! Rád bych přidal svůj příspěvek.
Za prvé:Postavil jsem pouze statické knihovny ffmpeg (z důvodů), ke kterým je proces sestavení opencv poněkud nepřátelský. Objevily se příspěvky od vývojářů opencv, které uváděly, že nepodporují sestavení opencv proti statickým knihovnám ffmpeg, ale moje myšlenka byla "co když také vytváříte statické knihovny opencv? Určitě by to mělo být podporováno?"
A odpověď je ano , můžete kompilovat statické knihovny opencv proti statickým knihovnám ffmpeg! Udělal jsem to s opencv 4.1.1 proti ffmpeg 4.2. Musel jsem použít následující možnosti cmake:
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 \
Tyto možnosti vedou k sadě statických knihoven opencv, které zahrnují jakékoli statické knihovny ffmpeg, které jste také vytvořili, za předpokladu, že vaše PKG_CONFIG_PATH je nastavena tak, aby tyto knihovny správně nacházela (nebo pokud jste je nainstalovali do nějakého výchozího umístění systému).
Otázka:
- Proč nemůžeme vytvářet aplikace?
- Proces sestavení opencv předpokládá, že vytváříte a propojujete sdílené knihovny, i když vytváříte pouze statické knihovny. Zdá se to spíše jako nedostatek v procesu sestavení než jako technické omezení; možná se to jednoho dne napraví.
- Co je příznak OPENCV_FFMPEG_SKIP_BUILD_CHECK?
- V procesu cmake ffmpeg existuje krok, kdy je aplikace sestavena a propojena pomocí stejného chybného procesu sestavování jako ostatní aplikace opencv. Je chybný v tom smyslu, že proces předpokládá, že se připojujete proti sdíleným knihovnám, když to není nutné; můžete provést stejné kroky sestavení sami, zatímco ne vytvoření tohoto předpokladu a vytvoření funkční aplikace. Tuto kontrolu sestavení je tedy třeba vypnout, aby opencv akceptovalo, že ano, ve skutečnosti je možné použít jakékoli statické knihovny, které najde. Toto je
- A proč deaktivujete podporu pythonu?
- Proces sestavení opencv pythonu explicitně vytváří sdílenou knihovnu, kterou lze načíst pomocí Pythonu.
- Znamená to, že stále vytváříte sadu testů i se statickými knihovnami?
- Ano. Ale nezkoušel jsem je spustit
Něco jako
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/
měl by pracovat. Alespoň to funguje pro OpenCV 2.4.x na mém Ubuntu.
Pro OpenCV 3.x a ffmpeg 3.x musím použít následující patch
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}"
A pomocí následujícího skriptu k sestavení
#!/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
Také při sestavování ffmpeg musím povolit příznaky --enable-avresample
.