Sono passati anni dalla domanda, ma di recente mi sono imbattuto nei tipi di problemi descritti in questa domanda! Vorrei aggiungere il mio contributo.
Primo:ho creato solo le librerie ffmpeg statiche (per motivi), verso le quali il processo di compilazione opencv è in qualche modo ostile. Ci sono stati post di sviluppatori opencv che affermano che non supportano una build opencv contro librerie ffmpeg statiche, ma il mio pensiero era "e se stessi creando anche librerie opencv statiche? Certamente dovrebbero essere supportate?"
E la risposta è sì , puoi compilare librerie opencv statiche contro librerie ffmpeg statiche! L'ho fatto con opencv 4.1.1 contro ffmpeg 4.2. Ho dovuto utilizzare le seguenti opzioni di 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 \
Queste opzioni si traducono in un insieme di librerie statiche opencv che includono qualsiasi libreria statica ffmpeg che hai anche creato, supponendo che il tuo PKG_CONFIG_PATH sia configurato per trovare correttamente quelle librerie (o se le hai installate in una posizione di sistema predefinita).
D/R:
- Perché non possiamo creare app?
- Il processo di compilazione opencv presuppone che tu stia compilando e collegando librerie condivise, anche se crei solo librerie statiche. Questo sembra un difetto nel processo di compilazione piuttosto che una limitazione tecnica; forse un giorno questo verrà risolto.
- Cos'è il flag OPENCV_FFMPEG_SKIP_BUILD_CHECK?
- C'è un passaggio nel processo cmake di ffmpeg in cui un'applicazione viene compilata e collegata utilizzando lo stesso processo di compilazione difettoso delle altre applicazioni di opencv. È difettoso nel senso che il processo presuppone che tu stia collegando a librerie condivise quando non è necessario; puoi eseguire tu stesso gli stessi passaggi di costruzione mentre non fare questo presupposto e creare un'applicazione funzionante. Pertanto, questo controllo di compilazione deve essere disattivato affinché opencv accetti che sì, in effetti, tutte le librerie statiche che trova possono essere utilizzate. Questo è
- E perché disabiliti il supporto di Python?
- Il processo di compilazione opencv python produce esplicitamente una libreria condivisa caricabile da Python.
- Questo implica che stai ancora costruendo la suite di test anche con le librerie statiche?
- Sì. Ma non ho provato a eseguirli
Qualcosa come
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/
dovrebbe funzionare. Almeno funziona con OpenCV 2.4.x sul mio Ubuntu.
Per OpenCV 3.x e ffmpeg 3.x, devo applicare la seguente 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}"
E con il seguente script da compilare
#!/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
Inoltre, quando costruisco ffmpeg, devo abilitare i flag --enable-avresample
.