Han pasado años después de que se hizo la pregunta, pero recientemente me encontré con el tipo de problemas descritos en esta pregunta. Me gustaría agregar mi entrada.
Primero:solo construí las bibliotecas ffmpeg estáticas (por razones), a las que el proceso de compilación opencv es algo hostil. Ha habido publicaciones de desarrolladores de opencv que afirman que no admiten una compilación de opencv contra bibliotecas ffmpeg estáticas, pero mi pensamiento fue "¿y si también está creando bibliotecas de opencv estáticas? Ciertamente, eso debería ser compatible".
Y la respuesta es sí , puede compilar bibliotecas opencv estáticas contra bibliotecas ffmpeg estáticas. Hice esto con opencv 4.1.1 contra ffmpeg 4.2. Tuve que usar las siguientes opciones de 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 \
Estas opciones dan como resultado un conjunto de bibliotecas estáticas opencv que incluyen cualquier biblioteca estática ffmpeg que también haya creado, suponiendo que su PKG_CONFIG_PATH esté configurado para encontrar correctamente esas bibliotecas (o si las ha instalado en alguna ubicación predeterminada del sistema).
P/R:
- ¿Por qué no podemos crear aplicaciones?
- El proceso de compilación de opencv asume que está compilando y vinculando bibliotecas compartidas, incluso si solo compila bibliotecas estáticas. Esto parece más una deficiencia en el proceso de construcción que una limitación técnica; quizás algún día esto se arregle.
- ¿Qué es el indicador OPENCV_FFMPEG_SKIP_BUILD_CHECK?
- Hay un paso en el proceso cmake de ffmpeg en el que se compila y vincula una aplicación utilizando el mismo proceso de compilación defectuoso que las otras aplicaciones de opencv. Es defectuoso en el sentido de que el proceso asume que se está vinculando con bibliotecas compartidas cuando no es necesario; puede realizar los mismos pasos de compilación usted mismo mientras no haciendo esa suposición y crear una aplicación de trabajo. Por lo tanto, esta verificación de compilación debe desactivarse para que opencv acepte que sí, de hecho, cualquier biblioteca estática que encuentre está bien para usar. esto es
- ¿Y por qué deshabilitas la compatibilidad con Python?
- El proceso de compilación de opencv python produce explícitamente una biblioteca compartida cargable por Python.
- ¿Esto implica que todavía está creando el conjunto de pruebas incluso con las bibliotecas estáticas?
- Sí. Pero no he intentado ejecutarlos
Algo como
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/
Deberia trabajar. Al menos funciona para OpenCV 2.4.x en mi Ubuntu.
Para OpenCV 3.x y ffmpeg 3.x, debo aplicar el siguiente parche
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}"
Y con el siguiente script para construir
#!/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
Además, cuando construyo ffmpeg, tengo que habilitar las banderas --enable-avresample
.