Ubuntu下利用NDK編譯ffmpeg+x264+fdk-aac

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章