在android app中使用opencv3.4.3 VideoCapture播放视频

    科技2023-10-04  82

    最近在使用opencv3.4.3过程中发现opencv编译的android库不支持VideoCapture播放视频,要支持VideoCapture需要修改编译cmake文件才能编译生成支持VideoCapture的库文件。

    下面是修改编译opencv3.4.3的相关处理:

    1. 修改opencv3.4.3目录下CMakeLists.txt文件如下:

    (1).修改以下IF (NOT ANDROID AND NOT IOS AND NOT WINRT)为IF (NOT IOS AND NOT WINRT)

    #OCV_OPTION(WITH_FFMPEG         "Include FFMPEG support"                      ON   IF (NOT ANDROID AND NOT IOS AND NOT WINRT) ) OCV_OPTION(WITH_FFMPEG         "Include FFMPEG support"                      ON   IF (NOT IOS AND NOT WINRT) )

    (2).修改以下elseif(WIN32)为elseif(WIN32 OR ANDROID)

    if(WITH_FFMPEG OR HAVE_FFMPEG) if(OPENCV_FFMPEG_USE_FIND_PACKAGE) status(" FFMPEG:" HAVE_FFMPEG THEN "YES (find_package)" ELSE "NO (find_package)") #elseif(WIN32) elseif(WIN32 OR ANDROID) status(" FFMPEG:" HAVE_FFMPEG THEN "YES (prebuilt binaries)" ELSE NO) else() status(" FFMPEG:" HAVE_FFMPEG THEN YES ELSE NO) endif() status(" avcodec:" FFMPEG_libavcodec_FOUND THEN "YES (ver ${FFMPEG_libavcodec_VERSION})" ELSE NO) status(" avformat:" FFMPEG_libavformat_FOUND THEN "YES (ver ${FFMPEG_libavformat_VERSION})" ELSE NO) status(" avutil:" FFMPEG_libavutil_FOUND THEN "YES (ver ${FFMPEG_libavutil_VERSION})" ELSE NO) status(" swscale:" FFMPEG_libswscale_FOUND THEN "YES (ver ${FFMPEG_libswscale_VERSION})" ELSE NO) status(" avresample:" FFMPEG_libavresample_FOUND THEN "YES (ver ${FFMPEG_libavresample_VERSION})" ELSE NO) endif()

    2.修改opencv343目录下cmake/OpenCVFindLibsVideo.cmake文件如下: 在FFMPEG段落中增加以下部分, 注意需要将FFMPEG_DIR替换为自己的ffmpeg android库文件所在目录

    elseif(ANDROID) set(HAVE_FFMPEG TRUE) set(FFMPEG_DIR ${OpenCV_SOURCE_DIR}/../ffmpeg) set(FFMPEG_INCLUDE_DIRS ${FFMPEG_DIR}/libs/${ANDROID_ABI}/include) set(FFMPEG_LIBRARY_DIRS ${FFMPEG_DIR}/libs/${ANDROID_ABI}/lib) set(FFMPEG_LIBRARIES avcodec avformat avutil swscale z) message(STATUS "FFMPEG_INCLUDE_DIR: ${FFMPEG_INCLUDE_DIRS}") message(STATUS "FFMPEG_LIBRARY_DIRS: ${FFMPEG_LIBRARY_DIRS}") message(STATUS "FFMPEG_LIBRARIES: ${FFMPEG_LIBRARIES}")

    FFMPEG段落

    # --- FFMPEG --- ocv_clear_vars(HAVE_FFMPEG) if(WITH_FFMPEG) # try FFmpeg autodetection if(OPENCV_FFMPEG_USE_FIND_PACKAGE) ... elseif(WIN32 AND NOT ARM AND NOT OPENCV_FFMPEG_SKIP_DOWNLOAD) ... elseif(PKG_CONFIG_FOUND) ... elseif(ANDROID) set(HAVE_FFMPEG TRUE) set(FFMPEG_DIR ${OpenCV_SOURCE_DIR}/../ffmpeg) set(FFMPEG_INCLUDE_DIRS ${FFMPEG_DIR}/libs/${ANDROID_ABI}/include) set(FFMPEG_LIBRARY_DIRS ${FFMPEG_DIR}/libs/${ANDROID_ABI}/lib) set(FFMPEG_LIBRARIES avcodec avformat avutil swscale z) message(STATUS "FFMPEG_INCLUDE_DIR: ${FFMPEG_INCLUDE_DIRS}") message(STATUS "FFMPEG_LIBRARY_DIRS: ${FFMPEG_LIBRARY_DIRS}") message(STATUS "FFMPEG_LIBRARIES: ${FFMPEG_LIBRARIES}") else() ... endif() endif()

    3.用NDK编译opencv

    在opencv根目录下创建一个build目录,在build目录下使用以下编译命令进行编译,生成opencv静态库,如要生成动态库,需要添加-DBUILD_SHARED_LIBS=ON

    编译命令如下:

    ANDROID_NDK, ANDROID_SDK,CMAKE_TOOLCHAIN_FILE需要替换为自己的NDK路径,此处使用NDK20编译。

    目标为arm64-v8a:

    cmake .. -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -DBUILD_SHARED_LIBS=OFF \ -DANDROID_NDK="/home/public/android/AS/android-studio-ide/Ndk/android-ndk-r20b-linux-x86_64/android-ndk-r20b" \ -DANDROID_SDK="/home/public/android/AS/android-studio-ide/Sdk" \ -DCMAKE_TOOLCHAIN_FILE=/home/public/android/AS/android-studio-ide/Ndk/android-ndk-r20b-linux-x86_64/android-ndk-r20b/build/cmake/android.toolchain.cmake \ -DANDROID_NATIVE_API_LEVEL=22 \ -DANDROID_ABI=arm64-v8a \ -DANDROID_CPP_FEATURES="rtti exceptions" \ -DANDROID_ARM_NEON=TRUE \ -DANDROID_TOOLCHAIN=clang \ -DANDROID_STL=c++_shared \ -DANDROID_PLATFORM=android-22 \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX="../install_release/android/arm64-v8a/" \ -DBUILD_opencv_java=OFF \ -DBUILD_ANDROID_PROJECTS=ON \ -DBUILD_ANDROID_EXAMPLES=OFF \ -DBUILD_DOCS=OFF \ -DBUILD_PERF_TESTS=OFF \ -DBUILD_TESTS=OFF \ -DWITH_CUDA=OFF \ -DWITH_MATLAB=OFF \ -DCUDA_FAST_MATH=ON \ -DWITH_CUFFT=ON \ -DWITH_NVCUVID=ON \ -DWITH_V4L=ON \ -DWITH_LIBV4L=ON \ -DWITH_FFMPEG=ON ../ make make install

    目标为armeabi-v7a:

    cmake .. -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -DBUILD_SHARED_LIBS=OFF \ -DANDROID_NDK="/home/public/android/AS/android-studio-ide/Ndk/android-ndk-r20b-linux-x86_64/android-ndk-r20b" \ -DANDROID_SDK="/home/public/android/AS/android-studio-ide/Sdk" \ -DCMAKE_TOOLCHAIN_FILE=/home/public/android/AS/android-studio-ide/Ndk/android-ndk-r20b-linux-x86_64/android-ndk-r20b/build/cmake/android.toolchain.cmake \ -DANDROID_NATIVE_API_LEVEL=22 \ -DANDROID_ABI=armeabi-v7a \ -DANDROID_CPP_FEATURES="rtti exceptions" \ -DANDROID_ARM_NEON=TRUE \ -DANDROID_TOOLCHAIN=clang \ -DANDROID_STL=c++_shared \ -DANDROID_PLATFORM=android-22 \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX="../install_release/android/armeabi-v7a/" \ -DBUILD_opencv_java=OFF \ -DBUILD_ANDROID_PROJECTS=ON \ -DBUILD_ANDROID_EXAMPLES=OFF \ -DBUILD_DOCS=OFF \ -DBUILD_PERF_TESTS=OFF \ -DBUILD_TESTS=OFF \ -DWITH_CUDA=OFF \ -DWITH_MATLAB=OFF \ -DCUDA_FAST_MATH=ON \ -DWITH_CUFFT=ON \ -DWITH_NVCUVID=ON \ -DWITH_V4L=ON \ -DWITH_LIBV4L=ON \ -DWITH_FFMPEG=ON ../ make make install

    使用示例: opencv343-android-videocapture

    Processed: 0.010, SQL: 9