1. 編譯平臺 Ubuntu
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)
不要在有換行連接符
\
的語句中插入注釋#
,有可能會使后面的內(nèi)容連接失敗物舒,尤其./configure
語句后面的option選項(xiàng)中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ù)定義
-
--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'
- 每一個(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 編譯
- 在
build.sh
編譯腳本所在的目錄打開終端 - 執(zhí)行
sudo sh build.sh
,開始編譯,腳本文件里指定了--prefix
,install目錄由--prefix
指定在源碼目錄文件夾下的dist
,安裝腳本會在dist
下生成安裝對應(yīng)CPU架構(gòu)
的的庫