Ubuntu下利用NDK编译ffmpeg+x264+fdk-aac

由于FFmpeg、x264、Fdk-aac的版本问题,所以编译的时候有很多坑
编译顺序:
首先利用脚本分别编译x264和fdk-aac库,生成头文件(.h)与静态库文件(.a/.la)。
将FFmpeg的外部链接设置为两个库的include与llib,也可将两个库的头文件和库文件分别放在一起
首先

FFmpeg编译脚本

这是在一个课程的脚本基础上改的

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/bash
echo "进入编译ffmpeg脚本"
NDK=/home/wzh/NDK/android-ndk-r14b
#5.0
PLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=armv7-a

#输出路径
PREFIX=/home/wzh/NDK/ffmpeg-3.4.2/android
#x264、fdk-aac的头文件以及.a(静态库)文件路径
EXTRA_CFLAGS="-I/home/wzh/NDK/android/include/"
EXTRA_LDFLAGS="-L/home/wzh/NDK/android/lib"
function buildFF
{
echo "开始编译ffmpeg"
./configure \
--prefix=$PREFIX \
--target-os=android \
#交叉编译
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--cpu=$CPU \
--sysroot=$PLATFORM \
#编译器
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--extra-libs=-ldl \
--enable-shared \
#使能fdk-aac库
--enable-libfdk-aac \
--enable-encoder=libfdk_aac \
--enable-decoder=libfdk_aac \
#使能X264库
--enable-libx264 \
--enable-encoder=libx264 \
--enable-runtime-cpudetect \
--enable-nonfree \
--enable-neon \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--enable-jni \
--enable-mediacodec \
--disable-debug \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
--extra-cflags=$EXTRA_CFLAGS \
--extra-ldflags=$EXTRA_LDFLAGS
make -j8
make install
echo "编译结束!"
}
#CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp "
buildFF

x264(20140916-2245-stable)编译脚本、网上找的微改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
NDK=/home/wzh/NDK/android-ndk-r14b
#5.0
PLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=armv7-a
#输出路径
PREFIX=/home/wzh/NDK/android
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-static \
--enable-shared \
--enable-pic \
--disable-cli \
--host=arm-linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$PLATFORM
}
build_one

Fdk-aac(0.1.4)编译脚本、网找微改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
NDK_HOME=/home/wzh/NDK/android-ndk-r14b

SYSROOT=$NDK_HOME/platforms/android-21/arch-arm

ANDROID_BIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/

CROSS_COMPILE=${ANDROID_BIN}/arm-linux-androideabi-

ARM_INC=$SYSROOT/usr/include

ARM_LIB=$SYSROOT/usr/lib
#用前确认路径
LDFLAGS=" -nostdlib -Bdynamic -Wl,--whole-archive -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi -L$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/lib -L$ARM_LIB -lc -lgcc -lm -ldl "

FLAGS="--host=arm-androideabi-linux --enable-static --disable-shared"

export CXX="${CROSS_COMPILE}g++ --sysroot=${SYSROOT}"

export LDFLAGS="$LDFLAGS"

export CC="${CROSS_COMPILE}gcc --sysroot=${SYSROOT}"

./configure $FLAGS \
--prefix='/home/wzh/NDK/android'

问题:
直接编译x264库的话会出现两个动态库 libx264.so 与 libx264.so.148
android会报错:找不到x264.so.148
原因是android识别不了文件格式,所以要先修改configure文件,由于在linux下编译,所以将最下面的SONAME值改成如图,删掉原有的.$API
在这里插入图片描述

ffmpeg编译时问题:找不到libx264或找不到fdk-aac
一般是由于路径设置的问题,如果路径设置正确,选项设置正确,那就可能是NDK/FFmpeg/Fdk-aac/x264之间版本不兼容造成的错误,更换版本可能发生奇迹!

最后生成的文件将输出到设置的输出文件路径,将include和lib的内容(.h文件与.so文件)拷贝到android工程的include与lib目录,配置好Cmake的相关库路径就可以使用了