編譯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)建當(dāng)前arch_abi的編譯目錄,比如:binary/armeabi-v7a
        cd ${BUILD_DIR}         #此處 進(jìn)了當(dāng)前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

    #從當(dāng)前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"

腳本編寫注意事項(xiàng)

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

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

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

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

#define B0 0000000

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

  1. --extra-cflags里不要加不被支持的選項(xiàng)景用,否則會出現(xiàn)C compiler test failed的錯(cuò)誤涵叮,具體哪些不被識別惭蹂,請報(bào)錯(cuò)之后查看config.log文件,比如在編譯arm64-v8a時(shí)

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

  1. 每一個(gè)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)系作者
  • 序言:七十年代末割粮,一起剝皮案震驚了整個(gè)濱河市盾碗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舀瓢,老刑警劉巖廷雅,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異京髓,居然都是意外死亡航缀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門堰怨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芥玉,“玉大人,你說我怎么就攤上這事备图〔忧桑” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵揽涮,是天一觀的道長抠藕。 經(jīng)常有香客問我,道長蒋困,這世上最難降的妖魔是什么盾似? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮雪标,結(jié)果婚禮上零院,老公的妹妹穿的比我還像新娘。我一直安慰自己汰聋,他們只是感情好门粪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烹困,像睡著了一般玄妈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上髓梅,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天烘嘱,我揣著相機(jī)與錄音盾饮,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛壹将,可吹牛的內(nèi)容都是我干的赊颠。 我是一名探鬼主播颁督,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爸舒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稿蹲,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤扭勉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后苛聘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涂炎,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年设哗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唱捣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡网梢,死狀恐怖震缭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情战虏,我是刑警寧澤蛀序,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站活烙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏遣鼓。R本人自食惡果不足惜啸盏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骑祟。 院中可真熱鬧回懦,春花似錦、人聲如沸次企。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缸棵。三九已至舟茶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堵第,已是汗流浹背吧凉。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踏志,地道東北人阀捅。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像针余,于是被迫代替她去往敵國和親饲鄙。 傳聞我的和親對象是個(gè)殘疾皇子凄诞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容