2018-04-21: 更新至 ffmpeg-4.0
使用AndroidStudio 开发 FFmpeg
Keywords: gradle, cmake
关键步骤,编译FFmpeg,Android Studio 集成。abi support:
armeabi
armeabi-v7a
arm64-v8a
x86
x86_64
ndk version android-ndk-r14bexport NDK_HOME=/opt/android/android-ndk-r14b
export NDK_HOST_PLATFORM=linux-x86_64
第一步,编译ffmpeg
首先下载并解压
wget https://ffmpeg.org/releases/ffmpeg-4.0.tar.bz2
tar xvf ffmpeg-4.0.tar.bz2
然后编写编译脚本
#!/bin/sh
PREFIX=android-build
COMMON_OPTIONS="\
--prefix=android/ \
--target-os=android \
--disable-static \
--enable-shared \
--enable-small \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--disable-asm \
"
function build_android {
./configure \
--libdir=${PREFIX}/libs/armeabi-v7a \
--incdir=${PREFIX}/includes/armeabi-v7a \
--pkgconfigdir=${PREFIX}/pkgconfig/armeabi-v7a \
--arch=arm \
--cpu=armv7-a \
--cross-prefix="${NDK_HOME}/toolchains/arm-linux-androideabi-4.9/prebuilt/${NDK_HOST_PLATFORM}/bin/arm-linux-androideabi-" \
--sysroot="${NDK_HOME}/platforms/android-19/arch-arm/" \
--extra-cflags="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
make clean
make -j8 && make install
./configure \
--libdir=${PREFIX}/libs/arm64-v8a \
--incdir=${PREFIX}/includes/arm64-v8a \
--pkgconfigdir=${PREFIX}/pkgconfig/arm64-v8a \
--arch=aarch64 \
--cpu=armv8-a \
--cross-prefix="${NDK_HOME}/toolchains/aarch64-linux-android-4.9/prebuilt/${NDK_HOST_PLATFORM}/bin/aarch64-linux-android-" \
--sysroot="${NDK_HOME}/platforms/android-21/arch-arm64/" \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
make clean
make -j8 && make install
./configure \
--libdir=${PREFIX}/libs/x86 \
--incdir=${PREFIX}/includes/x86 \
--pkgconfigdir=${PREFIX}/pkgconfig/x86 \
--arch=x86 \
--cpu=i686 \
--cross-prefix="${NDK_HOME}/toolchains/x86-4.9/prebuilt/${NDK_HOST_PLATFORM}/bin/i686-linux-android-" \
--sysroot="${NDK_HOME}/platforms/android-19/arch-x86/" \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
make clean
make -j8 && make install
./configure \
--libdir=${PREFIX}/libs/x86_64 \
--incdir=${PREFIX}/includes/x86_64 \
--pkgconfigdir=${PREFIX}/pkgconfig/x86_64 \
--arch=x86_64 \
--cpu=x86_64 \
--cross-prefix="${NDK_HOME}/toolchains/x86_64-4.9/prebuilt/${NDK_HOST_PLATFORM}/bin/x86_64-linux-android-" \
--sysroot="${NDK_HOME}/platforms/android-21/arch-x86_64/" \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
make clean
make -j8 && make install
};
build_android
此脚本实现了armeabi-v7a
,arm64-v8a
,x86
,x86_64
4个平台的编译。
- 需要添加系统环境变量
$NDK_PATH
-
--target-os=android
指定android
平台。 -
make install-libs
表示只安装so
文件
编译完成结果:

第二步,项目集成
- 新建项目,增加
C++
支持。手动创建jniLibs
文件夹 - 然后将上一步生成的所有文件复制到
jniLibs
文件夹下面
最终目录结构:

然后修改
CMakeLists.txt
文件,集成so
。
cmake_minimum_required(VERSION 3.4.1)
find_library(log-lib log)
add_library(native-lib
SHARED
src/main/cpp/native-lib.cpp )
set(JNI_LIBS_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)
add_library(avutil
SHARED
IMPORTED )
set_target_properties(avutil
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavutil.so )
add_library(swresample
SHARED
IMPORTED )
set_target_properties(swresample
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libswresample.so )
add_library(swscale
SHARED
IMPORTED )
set_target_properties(swscale
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libswscale.so )
add_library(avcodec
SHARED
IMPORTED )
set_target_properties(avcodec
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavcodec.so )
add_library(avformat
SHARED
IMPORTED )
set_target_properties(avformat
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavformat.so )
add_library(avfilter
SHARED
IMPORTED )
set_target_properties(avfilter
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavfilter.so )
add_library(avdevice
SHARED
IMPORTED )
set_target_properties(avdevice
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavdevice.so )
include_directories(${JNI_LIBS_DIR}/includes)
target_link_libraries(native-lib
avutil swresample swscale avcodec avformat avfilter avdevice
${log-lib} )
简要说明:
-
${ANDROID_ABI}
表示目标ABI,在官方文档中有说明:https://developer.android.com/ndk/guides/cmake.html
最后再放出效果图:

网友评论
String videoPath = Environment.getExternalStorageDirectory() + "/Movies/PERU.mp4";
mVideoView.playVideo(videoPath);
这个目录下,运行的时候总是报错
if (avformat_open_input(&formatContext, videoPath, NULL, NULL) != 0) {
ALOGE("Cannot open video file: %s\n%d\n", videoPath);
return;
}
这是为什么呢?
我改成了我看NDK 目录下 有这个 文件夹 "linux-x86_64" 然后就能编译了 ,但是 编译到最后 的时候 cmd 提示 说 倒数第二行 } not found 然后 命令就结束了, 然后 看结果 4个文件夹 都出来了 里面也有so文件 就是缺少include 文件 ···大哥还是这是什么情况吗?