天天看點

Android使用FFmpeg開發播發器(一)編譯FFmpeg

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官方文檔

最後編譯完成會生成幾個檔案夾:

Android使用FFmpeg開發播發器(一)編譯FFmpeg

lib:生成的靜态庫或動态庫

include:生成的頭檔案

share:示範demo

2、總結

下一篇文章:Android使用FFmpeg播放視訊(二)編寫代碼

繼續閱讀