由於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的相關庫路徑就可以使用了