This project is an example of how to use opencv3.4.3 VideoCapture and VideoWriter on Android application.
It seems that opencv does not support video capture feature on Android platform. To use video capture, you need to compile opencv library to support it or you can use the library files in project.
Build opencv for android platform
1.Modify CMakeLists.txt file in opencv root directory.
(1).change IF (NOT ANDROID AND NOT IOS AND NOT WINRT) to IF (NOT IOS AND NOT WINRT) as follows.
#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).Change elseif (Win32) to elseif (Win32 or Android) as follows.
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.Modify cmake/OpenCVFindLibsVideo.cmake file in opencv root directory.
Add the following part to FFMPEG section as below and replace FFMPEG_DIR with your own FFMPEG android library file directory.
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 ---
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. Use NDK to compile opencv
Build command for 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
Build command for 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