編譯Android平臺使用的FFmpeg(armeabi,armeabi-v7a,arm64-v8a,x86,x86_64)

1. 編譯平臺 Ubuntu

Ubuntu 16.04

2. NDK

linux環(huán)境NDK下載
? https://developer.android.google.cn/ndk/downloads/

這里編譯使用的是
? [Android NDK, Revision 15c][1] (July 2017)

3. 編譯過程

3.1 下載FFmpeg源碼

FFmpeg下載地址
: http://ffmpeg.org/download.html

最新版本: [FFmpeg 4.0][2] (4.0 was released on 2018-04-20.)

下載后解壓,打開終端,定位到下載目錄
tar -xvf ffmpeg-4.0.tar.xz

3.2 修改configure腳本

為了在Android上使用,我們修改生成so庫的腳本,生成以lib為前綴,.so為后置的name,在源文件目錄下找到configure腳本,差不多在3566

# SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
# LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
# SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
# SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
#修改為以下內(nèi)容

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

3.3 編寫編譯腳本

創(chuàng)建腳本文件 build.sh,編輯內(nèi)容,腳本文件位于FFmpeg源文件目錄下

#!/bin/sh

MY_LIBS_NAME=ffmpeg-4.0
MY_DIR=ffmpeg-4.0

# cd ./${MY_DIR}

#編譯的過程中產(chǎn)生的中間件的存放目錄,為了區(qū)分編譯目錄,源碼目錄,install目錄
MY_BUILD_DIR=binary


NDK_PATH=/home/as/Android/android-ndk-r15c
BUILD_PLATFORM=linux-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=24

ANDROID_ARMV5_CFLAGS="-march=armv5te"
ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"  #-mfloat-abi=hard -mfpu=vfpv3-d16 #-mfloat-abi=hard -mfpu=vfp
ANDROID_ARMV8_CFLAGS="-march=armv8-a"
ANDROID_X86_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"


# params($1:arch,$2:arch_abi,$3:host,$4:cross_prefix,$5:cflags)
build_bin() {

    echo "-------------------start build $2-------------------------"

    ARCH=$1         # arm arm64 x86 x86_64
    ANDROID_ARCH_ABI=$2     # armeabi armeabi-v7a x86 mips

    PREFIX=$(pwd)/dist/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}/

    HOST=$3
    SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ARCH}

    CFALGS=$5


    TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
    CROSS_PREFIX=${TOOLCHAIN}/bin/$4-

    # build 中間件
        BUILD_DIR=./${MY_BUILD_DIR}/${ANDROID_ARCH_ABI}

    echo "pwd==$(pwd)"
    echo "ARCH==${ARCH}"
    echo "PREFIX==${PREFIX}"
    echo "HOST==${HOST}"
    echo "SYSROOT=${SYSROOT}"
    echo "CFALGS=$5"
    echo "CFALGS=${CFALGS}"
    echo "TOOLCHAIN==${TOOLCHAIN}"
    echo "CROSS_PREFIX=${CROSS_PREFIX}"

    #echo "-------------------------按任意鍵繼續(xù)---------------------"
    #read -n 1
    #echo "-------------------------繼續(xù)執(zhí)行-------------------------"

    mkdir -p ${BUILD_DIR}   #創(chuàng)建當前arch_abi的編譯目錄,比如:binary/armeabi-v7a
        cd ${BUILD_DIR}         #此處 進了當前arch_abi的2級編譯目錄


    sh ../../${MY_DIR}/configure \
        --prefix=${PREFIX} \
        --target-os=linux \
        --arch=${ARCH} \
        --sysroot=$SYSROOT \
        --enable-cross-compile \
        --cross-prefix=${CROSS_PREFIX} \
        --extra-cflags="$CFALGS -Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated" \
        --extra-cxxflags="-D__thumb__ -fexceptions -frtti" \
        --extra-ldflags="-L${SYSROOT}/usr/lib" \
        --enable-shared \
        --enable-asm \
        --enable-neon \
        --disable-encoders \
        --enable-encoder=aac \
        --enable-encoder=mjpeg \
        --enable-encoder=png \
        --disable-decoders \
        --enable-decoder=aac \
        --enable-decoder=aac_latm \
        --enable-decoder=h264 \
        --enable-decoder=mpeg4 \
        --enable-decoder=mjpeg \
        --enable-decoder=png \
        --disable-demuxers \
        --enable-demuxer=image2 \
        --enable-demuxer=h264 \
        --enable-demuxer=aac \
        --disable-parsers \
        --enable-parser=aac \
        --enable-parser=ac3 \
        --enable-parser=h264 \
        --enable-gpl \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-symver \
        --disable-debug \
        --enable-small


    make clean
    make
    make install

    #從當前arch_abi編譯目錄跳出,對應(yīng)上面的cd ${BUILD_DIR},以便function多次執(zhí)行
        cd ../../

    echo "-------------------$2 build end-------------------------"
}


# build armeabi
build_bin arm armeabi arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV5_CFLAGS"

#build armeabi-v7a
build_bin arm armeabi-v7a arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV7_CFLAGS"

#build arm64-v8a
build_bin arm64 arm64-v8a aarch64-linux-android aarch64-linux-android "$ANDROID_ARMV8_CFLAGS"

#build x86
build_bin x86 x86 x86 i686-linux-android "$ANDROID_X86_CFLAGS"

#build x86_64
build_bin x86_64 x86_64 x86_64 x86_64-linux-android "$ANDROID_X86_64_CFLAGS"

腳本編寫注意事項

  1. 不要在有換行連接符\的語句中插入注釋#,有可能會使后面的內(nèi)容連接失敗,尤其 ./configure語句后面的option選項中

  2. FFmpeg 4.0 源碼編譯中會出現(xiàn)以下兩個文件的編譯錯誤

libavcodec / aaccoder.c:函數(shù)'search_for_ms':
libavcodec / aaccoder.c:803:25:錯誤:預(yù)期的標識符或'('數(shù)字常量之前
libavcodec / hevc_mvs.c:函數(shù)'derive_spatial_merge_candidates'
libavcodec / hevc_mvs.c:368:23:錯誤:'y0000000'未聲明(首次在此函數(shù)中使用

是因為在include的/usr/arm-linux-androideabi/include/asm/termbits.h文件中定義了B0 0000000的宏,導(dǎo)致aaccooder.c hevc_mvs.c文件中的B0變量被宏替換

#define B0 0000000

解決方法就是,在這兩個文件中,把所有的B0,替換成其它字符,比如我替換為:bb, 注意不要和其它變量重復(fù)定義

  1. --extra-cflags里不要加不被支持的選項,否則會出現(xiàn)C compiler test failed的錯誤,具體哪些不被識別,請報錯之后查看config.log文件,比如在編譯arm64-v8a

aarch64-linux-android-gcc: error: unrecognized command line option '-mfloat-abi=softfp'

  1. 每一個arch編譯過程中出現(xiàn)以下 WARNING可以忽略

WARNING: /home/as/Android/android-ndk-r15c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-pkg-config not found, library detection may fail.

3.4 編譯

  1. build.sh編譯腳本所在的目錄打開終端
  2. 執(zhí)行 sudo sh build.sh,開始編譯,腳本文件里指定了--prefix,install目錄由--prefix指定在源碼目錄文件夾下的dist,安裝腳本會在dist下生成安裝對應(yīng)CPU架構(gòu)的的庫
    sh編譯過程
pwd
dist
arm64-v8a


  1. https://developer.android.google.cn/ndk/downloads/older_releases#ndk-15c-downloads ?

  2. https://ffmpeg.org/releases/ffmpeg-4.0.tar.bz2 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容