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

版权声明: https://blog.csdn.net/github_37209555/article/details/85169072

由于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
#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)编译脚本、网上找的微改

#!/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)编译脚本、网找微改

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的相关库路径就可以使用了

猜你喜欢

转载自blog.csdn.net/github_37209555/article/details/85169072