ffmpeg iOS平臺編譯 指令碼註釋

zeng沐白發表於2018-07-07

一、編譯過程

  • 1.下載原始碼
  • 2.預先編譯作為外掛的庫fdk-aac,x264等。
  • 3.安裝yasm
  • 4.安裝編譯工具
  • 5.編寫指令碼
  • 6.執行指令碼
    ffmpeg-ios流程.png

二、指令碼註解(包含fdk,x264庫的整合,如果不包含編譯,需要移除configure相關編譯引數)

#!/bin/sh

# directories
#賦值原始碼版本
SOURCE="ffmpeg-4.0.1"
#FAT資料夾名稱
FAT="FFmpeg-iOS"
#資料夾名稱
SCRATCH="scratch"
# must be an absolute path
#THIN路徑
THIN=`pwd`/"thin"
#架構型別陣列
ARCHS="arm64 armv7"

# absolute path to x264 library
X264=`pwd`/x264-ios

# absolute path to fdk-aac library
FDK_AAC=`pwd`/fdk-aac-ios

#編譯選項
CONFIGURE_FLAGS="--enable-gpl --disable-shared --disable-stripping --disable-ffmpeg --disable-ffplay  --disable-ffprobe --disable-avdevice --disable-indevs --disable-filters --disable-devices --disable-parsers --disable-postproc --disable-debug --disable-asm --disable-yasm --disable-doc --disable-bsfs --disable-muxers --disable-demuxers --disable-ffplay --disable-ffprobe  --disable-indevs --disable-outdevs --enable-cross-compile --enable-filter=aresample --enable-bsf=aac_adtstoasc --enable-small --enable-dct --enable-dwt --enable-lsp --enable-mdct --enable-rdft --enable-fft --enable-static --enable-version3 --enable-nonfree --disable-encoders --enable-encoder=pcm_s16le --enable-encoder=aac --enable-encoder=libx264 --enable-encoder=mp2 --disable-decoders --enable-decoder=aac --enable-decoder=mp3 --enable-decoder=h264 --enable-decoder=pcm_s16le --disable-parsers --enable-parser=aac --enable-parser=mpeg4video --enable-parser=mpegvideo --enable-parser=mpegaudio --enable-parser=aac --disable-muxers --enable-muxer=flv --enable-muxer=mp4 --enable-muxer=wav --enable-muxer=adts --disable-demuxers --enable-demuxer=flv --enable-demuxer=mpegvideo --enable-demuxer=mpegtsraw --enable-demuxer=mpegts --enable-demuxer=mpegps --enable-demuxer=h264 --enable-demuxer=y4m --enable-demuxer=wav --enable-demuxer=aac --enable-demuxer=hls --enable-demuxer=mov --enable-demuxer=m4v --disable-protocols --enable-protocol=rtmp --enable-protocol=http --enable-protocol=file --enable-libx264 --enable-libfdk-aac --enable-libfdk_aac --enable-encoder=libfdk_aac"

COMPILE="y"
LIPO="y"

#支援的iOS最低版本
DEPLOYMENT_TARGET="8.0"

#賦值部分結束

if [ "$*" ]
then
    if [ "$*" = "lipo" ]
    then
        # skip compile
        COMPILE=
    else
        ARCHS="$*"
        if [ $# -eq 1 ]
        then
            # skip lipo
            LIPO=
        fi
    fi
fi

if [ "$COMPILE" ]
then
#是否安裝yasm,x86彙編反彙編器 支援16位、32位、64位
    if [ ! `which yasm` ]
    then
        echo 'Yasm not found'
        #是否安裝brew軟體包管理工具
        if [ ! `which brew` ]
        then
            echo 'Homebrew not found. Trying to install...'
                        ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" \
                || exit 1
        fi
        echo 'Trying to install Yasm...'
        brew install yasm || exit 1
    fi
    #是否已經安裝ffmpeg編譯工具
    if [ ! `which gas-preprocessor.pl` ]
    then
        echo 'gas-preprocessor.pl not found. Trying to install...'
        (curl -L https://github.com/libav/gas-preprocessor/raw/master/gas-preprocessor.pl \
            -o /usr/local/bin/gas-preprocessor.pl \
            && chmod +x /usr/local/bin/gas-preprocessor.pl) \
            || exit 1
    fi

    if [ ! -r $SOURCE ]
    then
        echo 'FFmpeg source not found. Trying to download...'
        #嘗試下載對於的ffmpeg原始碼並解壓,如果失敗就退出
        curl http://www.ffmpeg.org/releases/$SOURCE.tar.bz2 | tar xj \
            || exit 1
    fi

#賦值當前路徑
    CWD=`pwd`
    #遍歷需要編譯的架構
    for ARCH in $ARCHS
    do
        echo "building $ARCH..."
        #建立/scratch/$ARCH目錄
        mkdir -p "$SCRATCH/$ARCH"
        #進入目錄
        cd "$SCRATCH/$ARCH"

        CFLAGS="-arch $ARCH"
        if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
        then
        #如果是模擬器
            PLATFORM="iPhoneSimulator"
            #編譯引數 最低系統版本
            CFLAGS="$CFLAGS -mios-simulator-version-min=$DEPLOYMENT_TARGET"
        else
            #如果是真機
            PLATFORM="iPhoneOS"
            CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET"
            if [ "$ARCH" = "arm64" ]
            then
                EXPORT="GASPP_FIX_XCODE5=1"
            fi
        fi

        #PLATFORM變數轉換為小寫並賦值給XCRUN_SDK
        XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
        CC="xcrun -sdk $XCRUN_SDK clang"
        CXXFLAGS="$CFLAGS"
        LDFLAGS="$CFLAGS"
        if [ "$X264" ]
        then
        #指定標頭檔案路徑
            CFLAGS="$CFLAGS -I$X264/include"
            #指定庫路徑
            LDFLAGS="$LDFLAGS -L$X264/lib"
        fi
        if [ "$FDK_AAC" ]
        then
            CFLAGS="$CFLAGS -I$FDK_AAC/include"
            LDFLAGS="$LDFLAGS -L$FDK_AAC/lib"
        fi

        #修改configure編譯引數
        TMPDIR=${TMPDIR/%\/} $CWD/$SOURCE/configure \
            --target-os=darwin \
            --arch=$ARCH \
            --cc="$CC" \
            $CONFIGURE_FLAGS \
            --extra-cflags="$CFLAGS" \
            --extra-ldflags="$LDFLAGS" \
            --prefix="$THIN/$ARCH" \
        || exit 1
        #清除之前編譯的可執行檔案及配置檔案。 
        echo 'build-ffmpeg:make clean'
        make clean
        echo 'build-ffmpeg:make'
        #make || exit 1
        echo 'build-ffmpeg:make install'
        #make install $EXPORT || exit 1
        make -j3 install $EXPORT || exit 1
        cd $CWD
    done
fi


if [ "$LIPO" ]
then
    echo "building fat binaries..."
    mkdir -p $FAT/lib
    set - $ARCHS
    CWD=`pwd`
    cd $THIN/$1/lib
    for LIB in *.a
    do
        cd $CWD
        echo lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB 1>&2
        #合併.a庫
        lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB || exit 1
    done

    cd $CWD
    cp -rf $THIN/$1/include $FAT
fi

echo Done

複製程式碼

三、相關命令

命令/引數 說明
which 檢視可執行檔案的位置
curl 下載相關資源
tar xj 解壓相關資源
make 對原始碼包進行編譯
make install 安裝編譯後的程式碼包
configure 生成makefile檔案,並可在後面指定相關編譯選項

configure 編譯選項,可用 ./configure --help檢視

引數 說明 [預設]
--target-os compiler targets OS []
--prefix=PREFIX install in PREFIX [/usr/local]
--cc=CC use C compiler CC [gcc]
--extra-cflags=ECFLAGS 指定標頭檔案路徑 add ECFLAGS to CFLAGS []
--extra-ldflags=ELDFLAGS 指定庫檔案路徑 add ELDFLAGS to LDFLAGS []

參考:

www.linuxidc.com/Linux/2011-…

blog.csdn.net/xinyuan5102…

blog.csdn.net/shenhuxi_yu…

www.jianshu.com/p/e590f041c…

相關文章