1、編譯FFmpeg4.2.2
1.1、編譯環境
作業系統:linux,筆者用的是自己的伺服器小水管centos7
NDK版本:r21 https://developer.android.google.cn/ndk/downloads/ 下載下傳并解壓到相應目錄
FFmpeg版本:4.2.2 http://ffmpeg.org/download.html 下載下傳并解壓到相應目錄
1.2、配置
1.2.1、修改FFmpeg 配置檔案
下載下傳完的FFmpeg解壓後,進入解壓後的目錄即FFmpeg根目錄,找到configure檔案,替換部分内容,
将
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)'
替換為
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
1.2.2、編寫編譯腳本
在FFmpeg源碼根目錄建立shell腳本build_ffmpeg_android.sh
#!/bin/bash
#設定ndk目錄
NDK=/usr/ffmpeg/android-ndk-r21
API=21
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
#armv7 arm64 x86 x86_64
ARCH=armv7
#arm aarch64 i686 x86_64
ARCH2=arm
echo '第一個參數: '$1
if [ ! -n $1 ]
then
echo "沒有參數 使用預設架構"
else
ARCH=$1
if [ $1 == "arm64" ]
then
ARCH2=aarch64
elif [ $1 == "x86" ]
then
ARCH2=i686
elif [ $1 == "x86_64" ]
then
ARCH2=x86_64
fi
fi
echo "ARCH:${ARCH}, ARCH2:${ARCH2}"
if [ $ARCH == "armv7" ]
then
PLATFORM=$ARCH2-linux-androideabi
ANDROID_CROSS_PREFIX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-
else
PLATFORM=$ARCH2-linux-android
ANDROID_CROSS_PREFIX=$TOOLCHAIN/bin/$PLATFORM$API-
fi
OS=android
CROSS_PREFIX=$TOOLCHAIN/bin/$PLATFORM-
#儲存目錄
PREFIX=/usr/ffmpeg/ndk_output/$ARCH
./configure \
--prefix=$PREFIX \
--enable-cross-compile \
--cross-prefix=$CROSS_PREFIX \
--arch=$ARCH \
--target-os=$OS \
--pkg-config=$(which pkg-config) \
--cc=${ANDROID_CROSS_PREFIX}clang \
--cxx=${ANDROID_CROSS_PREFIX}clang++ \
--disable-static \
--disable-doc \
--disable-asm \
--disable-x86asm \
--disable-stripping \
--sysroot=$SYSROOT \
--fatal-warnings \
--enable-gpl \
--enable-version3 \
--enable-nonfree \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--enable-pic \
--enable-jni \
--enable-shared \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-decoder=hevc_mediacodec \
--enable-decoder=mpeg4_mediacodec \
--enable-decoder=vp8_mediacodec \
--enable-decoder=vp9_mediacodec \
--enable-encoder=aac \
--enable-decoder=aac \
--enable-decoder=aac_latm \
make clean
make -j4
make install
腳本編寫完成,sudo ./build_ffmpeg_android.sh armv7 運作,後面帶了一個參數為腳本對應的ARCH,筆者這裡通過指令參數去判斷需要生成的架構,不同架構請輸入不同參數armv7 arm64 x86 x86_64,預設不輸入為armv7,armv7平台是比較特殊的
以下需要注意幾點:
1、需要注意的是NDK r19後使用clang編譯器,設定工具鍊目錄有所差別
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
在linux直接使用linux-x86_64,macos需要改為
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
2、build_ffmpeg_android.sh腳本下的configure配置項根據需求配置需要的項目,可參考FFmpeg官方文檔
最後編譯完成會生成幾個檔案夾:
lib:生成的靜态庫或動态庫
include:生成的頭檔案
share:示範demo
2、總結
下一篇文章:Android使用FFmpeg播放視訊(二)編寫代碼