由于FFmpeg、x264、Fdk-aac的版本问题,所以编译的时候有很多坑
编译顺序:
首先利用脚本分别编译x264和fdk-aac库,生成头文件(.h)与静态库文件(.a/.la)。
将FFmpeg的外部链接设置为两个库的include与llib,也可将两个库的头文件和库文件分别放在一起
首先
FFmpeg编译脚本
这是在一个课程的脚本基础上改的
#!/bin/bash
echo "进入编译ffmpeg脚本"
NDK=/home/wzh/NDK/android-ndk-r14b
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
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 \--enable-libfdk-aac \--enable-encoder=libfdk_aac \--enable-decoder=libfdk_aac \--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 -j8make install echo "编译结束!"
}
buildFF
x264(20140916-2245-stable)编译脚本、网上找的微改
#!/bin/bash
NDK=/home/wzh/NDK/android-ndk-r14b
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)编译脚本、网找微改
NDK_HOME=/home/wzh/NDK/android-ndk-r14bSYSROOT=$NDK_HOME/platforms/android-21/arch-armANDROID_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/includeARM_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的相关库路径就可以使用了