zoukankan      html  css  js  c++  java
  • FFmpeg iOS端交叉编译

    安装方式

    • 下载iOS版本FFmpeg静态库: 即不用手动编译,我们只需要下载得到头文件及.a库文件。
    • 手动编译: 下载源码, 可以在更改一些flag或源码后再编译脚本,较为灵活。

    编译FFmpeg

    其中编译脚本具体为:

    #!/bin/sh
    
    # directories
    FF_VERSION="4.3.1"
    #FF_VERSION="snapshot-git"
    if [[ $FFMPEG_VERSION != "" ]]; then
      FF_VERSION=$FFMPEG_VERSION
    fi
    SOURCE="ffmpeg-$FF_VERSION"
    FAT="FFmpeg-iOS"
    
    SCRATCH="scratch"
    # must be an absolute path
    THIN=`pwd`/"thin"
    
    # absolute path to x264 library
    #X264=`pwd`/fat-x264
    
    #FDK_AAC=`pwd`/../fdk-aac-build-script-for-iOS/fdk-aac-ios
    
    CONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs 
                     --disable-doc --enable-pic"
    
    if [ "$X264" ]
    then
    	CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-gpl --enable-libx264"
    fi
    
    if [ "$FDK_AAC" ]
    then
    	CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-libfdk-aac --enable-nonfree"
    fi
    
    # avresample
    #CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-avresample"
    
    ARCHS="arm64 armv7 x86_64 i386"
    
    COMPILE="y"
    LIPO="y"
    
    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
    	if [ ! `which yasm` ]
    	then
    		echo 'Yasm not found'
    		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
    	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...'
    		curl http://www.ffmpeg.org/releases/$SOURCE.tar.bz2 | tar xj 
    			|| exit 1
    	fi
    
    	CWD=`pwd`
    	for ARCH in $ARCHS
    	do
    		echo "building $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 -fembed-bitcode"
    		    if [ "$ARCH" = "arm64" ]
    		    then
    		        EXPORT="GASPP_FIX_XCODE5=1"
    		    fi
    		fi
    
    		XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
    		CC="xcrun -sdk $XCRUN_SDK clang"
    
    		# force "configure" to use "gas-preprocessor.pl" (FFmpeg 3.3)
    		if [ "$ARCH" = "arm64" ]
    		then
    		    AS="gas-preprocessor.pl -arch aarch64 -- $CC"
    		else
    		    AS="gas-preprocessor.pl -- $CC"
    		fi
    
    		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
    
    		TMPDIR=${TMPDIR/%/} $CWD/$SOURCE/configure 
    		    --target-os=darwin 
    		    --arch=$ARCH 
    		    --cc="$CC" 
    		    --as="$AS" 
    		    $CONFIGURE_FLAGS 
    		    --extra-cflags="$CFLAGS" 
    		    --extra-ldflags="$LDFLAGS" 
    		    --prefix="$THIN/$ARCH" 
    		|| 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
    		lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB || exit 1
    	done
    
    	cd $CWD
    	cp -rf $THIN/$1/include $FAT
    fi
    
    echo Done
    

    注意1:在这里可以仅下载FFmpeg-iOS编译脚本,不用下载源码,执行脚本会自动下载源码,如果不想每次自动下载,可以手动下载源码,稍微修改下FFmpeg编译脚本即可。

    注意2:在编译脚本里面有对yasm和gas-preprocessor的支持判断,没有该环境会自动下载并配置。

    脚本使用方法

    # 编译所有的架构:
      ./build-ffmpeg.sh
    
    # 编译arm64架构:
      ./build-ffmpeg.sh arm64
    
    # 编译armv7和x6——64架构:
      ./build-ffmpeg.sh armv7 x86_64
    
    # 从单独编译的thin库中编译fat库:
      ./build-ffmpeg.sh lipo
    

    iOS项目集成FFmpeg

    编译功后,会生成FFmpeg-iOS文件,将该文件直接拖到项目中即可

  • 相关阅读:
    AS3 Signals
    Activate、Deactivate 事件 Activate ThrottleEvent;
    Git 单机版
    SVN 快速入门
    Git 简介
    SVN
    Git
    Python 对目录做遍历
    Python hashlib 模块
    __name__
  • 原文地址:https://www.cnblogs.com/AliliWl/p/14994556.html
Copyright © 2011-2022 走看看