编译ffmpeg
使用Mac:
下载ffmpeg:我这边下的是4.0
<https://github.com/FFmpeg/FFmpeg/tree/release/4.0>
下载ndk:用的之前下好的r16 (r17也ok,但是不能比r17更高了,更高版本没有gcc而是clang)
将ndk加入环境变量(vim ~/.bash_profile)
- 在ffmpeg目录下新建一个shell脚本:build.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
NDK_ROOT=/Users/kb_jay/Documents/ndk-home/android-ndk-r16b
CPU=arm-linux-androideabi
TOOLCHAIN=$NDK_ROOT/toolchains/$CPU-4.9/prebuilt/darwin-x86_64
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"
INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include"
PREFIX=./android/armeabi-v7a
./configure \ # 执行configure
--prefix=$PREFIX \ # 指定结果目录
--enable-small \ # 压缩体积
--disable-programs \ # 不编译ffmpeg程序,我们只需要静态库(.a)
--disable-avdevice \ # 关闭avdevice(这个在android中没用)
--disable-encoders \ # 关闭编码器 (如果要使用到音视频编码,需要打开)
--disable-muxers \ # 关闭封装器(不需要mp4,所以关掉)
--disable-filters \ # 关闭滤镜
--enable-cross-compile \ # 开启交叉编译
--cross-prefix=$TOOLCHAIN/bin/$CPU- \ # gcc的前缀
--disable-shared \ # 非动态so
--enable-static \ # 静态a
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \ # 指定编译的逻辑目录
--extra-cflags="$FLAGS $INCLUDES" \ # gcc的参数
--extra-cflags="-isysroot $NDK_ROOT/sysroot/" \ #gcc的参数
--arch=arm \ # arm架构
--target-os=android # Android系统
# 清理
make clean
#执行makefile
make install执行build.sh
在ffmpeg/android/armeabi-v7a下会有我们需要的头文件以及6个静态库
集成到开发项目中
新建as项目(c++)
将cmakelists.txt文件剪切到app目录下,跟app的build.gradle同级
build.gradle如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.kbjay.ffmepegdemo"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
abiFilters "armeabi-v7a"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}将6个静态库copy到libs/armeabi-v7a/下
将头文件copy到cpp/include下
修改CmakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25cmake_minimum_required(VERSION 3.6.0)
file(GLOB SOURCE ${CMAKE_SOURCE_DIR}/src/main/cpp/*.cpp)
add_library(
native-lib
SHARED
${SOURCE})
# 设置头文件
include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)
# 通过修改CMAKE_CXX_FLAGS设置静态库的路径
set(lib_path ${CMAKE_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${lib_path}")
# 设置依赖
target_link_libraries(
native-lib
avcodec
avfilter
avformat
avutil
swresample
swscale
log)测试,修改native-lib.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
extern "C" {
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_kbjay_ffmepegdemo_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
const char *str = av_version_info();
__android_log_print(ANDROID_LOG_ERROR, "ffmepeg", "%s", str);
return env->NewStringUTF(str);
}运行app,显示->4.0.5.
以上。