ffmpeg xcode 中的使用

    最近比较闲,苦于ios设备上没有直接播放torrent 文件的软件,开始折腾了.找了不少资料有了思路.但是其中用到了ffmpeg 这个东西.

  ffmpeg 是通用的一个视频解决框架,用C语言编写,通用性很强.

  1. 编译ffmpeg.
    1. 下载源码后可以自己手动编译 ,反正是通过各种命令 配置configure 
    2. 通过一个很牛逼的脚本:git@github.com:kewlbear/FFmpeg-iOS-build-script.git     下载之后,检查ffmpeg的版本号,替换成最新的 然后运行脚本就行了
      #!/bin/sh
      
      # directories
      SOURCE="ffmpeg-2.5"
      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/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"
      fi
      
      # avresample
      #CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-avresample"
      
      ARCHS="arm64 armv7s armv7 x86_64 i386"
      
      COMPILE="y"
      LIPO="y"
      
      DEPLOYMENT_TARGET="6.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.github.com/Homebrew/homebrew/go/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"
      		    if [ "$ARCH" = "arm64" ]
      		    then
      		        EXPORT="GASPP_FIX_XCODE5=1"
      		    fi
      		fi
      
      		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
      
      		TMPDIR=${TMPDIR/%/} $CWD/$SOURCE/configure 
      		    --target-os=darwin 
      		    --arch=$ARCH 
      		    --cc="$CC" 
      		    $CONFIGURE_FLAGS 
      		    --extra-cflags="$CFLAGS" 
      		    --extra-cxxflags="$CXXFLAGS" 
      		    --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
      
  2. 导入项目,有静态包经验的就就不用看了,这个对于我这个半路出家的和尚还是处理了老半天才解决.
    .a文件直接导入 .h文件要导入文件夹结构   配置header search 环境变量  使用的时候导入文件 结构:#import "文件夹/文件.h"
  3. 编译.
    1. 首次编译.
      Undefined symbols for architecture armv7:
        "_deflateInit2_", referenced from:
            _encode_frame in libavcodec.a(pngenc.o)
        "_crc32", referenced from:
            _encode_frame in libavcodec.a(pngenc.o)
        "_deflateReset", referenced from:
            _encode_frame in libavcodec.a(lclenc.o)
            _encode_frame in libavcodec.a(zmbvenc.o)
        "_compress", referenced from:
            _encode_strip in libavcodec.a(tiffenc.o)
        "_deflateBound", referenced from:
            _flashsv_decode_frame in libavcodec.a(flashsv.o)
            _encode_frame in libavcodec.a(pngenc.o)
            _encode_frame in libavcodec.a(lclenc.o)
        "_inflateSync", referenced from:
            _flashsv_decode_frame in libavcodec.a(flashsv.o)
        "_inflateReset", referenced from:
            _flashsv_decode_frame in libavcodec.a(flashsv.o)
            _zlib_decomp in libavcodec.a(lcldec.o)
            _decode_frame in libavcodec.a(tscc.o)
            _zerocodec_decode_frame in libavcodec.a(zerocodec.o)
            _decode_frame in libavcodec.a(zmbv.o)
        "_iconv_open", referenced from:
            _avcodec_open2 in libavcodec.a(utils.o)
            _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
        "_BZ2_bzDecompress", referenced from:
            _matroska_decode_buffer in libavformat.a(matroskadec.o)
        "_inflate", referenced from:
            _http_read_stream in libavformat.a(http.o)
            _matroska_decode_buffer in libavformat.a(matroskadec.o)
            _rtmp_open in libavformat.a(rtmpproto.o)
            _zlib_refill in libavformat.a(swfdec.o)
            _decode_frame_common in libavcodec.a(pngdec.o)
            _decode_text_chunk in libavcodec.a(pngdec.o)
            _flashsv_decode_frame in libavcodec.a(flashsv.o)
            ...
        "_inflateInit_", referenced from:
            _matroska_decode_buffer in libavformat.a(matroskadec.o)
            _rtmp_open in libavformat.a(rtmpproto.o)
            _swf_read_header in libavformat.a(swfdec.o)
            _decode_frame_apng in libavcodec.a(pngdec.o)
            _decode_frame_png in libavcodec.a(pngdec.o)
            _decode_text_chunk in libavcodec.a(pngdec.o)
            _flashsv_decode_init in libavcodec.a(flashsv.o)
            ...
        "_iconv", referenced from:
            _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
        "_BZ2_bzDecompressEnd", referenced from:
            _matroska_decode_buffer in libavformat.a(matroskadec.o)
        "_inflateInit2_", referenced from:
            _http_read_header in libavformat.a(http.o)
        "_deflateEnd", referenced from:
            _flashsv_decode_frame in libavcodec.a(flashsv.o)
            _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o)
            _flashsv_encode_init in libavcodec.a(flashsvenc.o)
            _flashsv_encode_end in libavcodec.a(flashsvenc.o)
            _encode_frame in libavcodec.a(pngenc.o)
            _encode_end in libavcodec.a(lclenc.o)
            _encode_init in libavcodec.a(zmbvenc.o)
            ...
        "_BZ2_bzDecompressInit", referenced from:
            _matroska_decode_buffer in libavformat.a(matroskadec.o)
        "_deflateInit_", referenced from:
            _flashsv_decode_frame in libavcodec.a(flashsv.o)
            _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o)
            _encode_init in libavcodec.a(lclenc.o)
            _encode_init in libavcodec.a(zmbvenc.o)
        "_zlibCompileFlags", referenced from:
            _http_read_header in libavformat.a(http.o)
        "_compress2", referenced from:
            _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o)
            _flashsv_encode_frame in libavcodec.a(flashsvenc.o)
        "_deflate", referenced from:
            _flashsv_decode_frame in libavcodec.a(flashsv.o)
            _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o)
            _encode_frame in libavcodec.a(pngenc.o)
            _encode_frame in libavcodec.a(lclenc.o)
            _encode_frame in libavcodec.a(zmbvenc.o)
        "_inflateEnd", referenced from:
            _http_close in libavformat.a(http.o)
            _http_read_header in libavformat.a(http.o)
            _matroska_decode_buffer in libavformat.a(matroskadec.o)
            _rtmp_open in libavformat.a(rtmpproto.o)
            _swf_read_close in libavformat.a(swfdec.o)
            _decode_frame_apng in libavcodec.a(pngdec.o)
            _decode_frame_png in libavcodec.a(pngdec.o)
            ...
        "_uncompress", referenced from:
            _id3v2_read_internal in libavformat.a(id3v2.o)
            _mov_read_cmov in libavformat.a(mov.o)
            _swf_read_packet in libavformat.a(swfdec.o)
            _decode_frame in libavcodec.a(cscd.o)
            _decode_frame in libavcodec.a(dxa.o)
            _decode_block in libavcodec.a(exr.o)
            _g2m_decode_frame in libavcodec.a(g2meet.o)
            ...
        "_iconv_close", referenced from:
            _avcodec_open2 in libavcodec.a(utils.o)
            _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
      ld: symbol(s) not found for architecture armv7
      clang: error: linker command failed with exit code 1 (use -v to see invocation)

      导入 libz.1.2.5.dylib ,再次编译

      Undefined symbols for architecture armv7:
        "_BZ2_bzDecompressInit", referenced from:
            _matroska_decode_buffer in libavformat.a(matroskadec.o)
        "_iconv", referenced from:
            _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
        "_BZ2_bzDecompress", referenced from:
            _matroska_decode_buffer in libavformat.a(matroskadec.o)
        "_BZ2_bzDecompressEnd", referenced from:
            _matroska_decode_buffer in libavformat.a(matroskadec.o)
        "_iconv_open", referenced from:
            _avcodec_open2 in libavcodec.a(utils.o)
            _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
        "_iconv_close", referenced from:
            _avcodec_open2 in libavcodec.a(utils.o)
            _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
      ld: symbol(s) not found for architecture armv7
      clang: error: linker command failed with exit code 1 (use -v to see invocation)

      导入 libbz2.1.0.dylib ,再次编译

      Undefined symbols for architecture armv7:
        "_iconv", referenced from:
            _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
        "_iconv_open", referenced from:
            _avcodec_open2 in libavcodec.a(utils.o)
            _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
        "_iconv_close", referenced from:
            _avcodec_open2 in libavcodec.a(utils.o)
            _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
      ld: symbol(s) not found for architecture armv7
      clang: error: linker command failed with exit code 1 (use -v to see invocation)

      导入  libiconv.2.4.0.dylib  编译通过   3.0 后不通过

      Undefined symbols for architecture x86_64:
        "_CMBlockBufferCreateWithMemoryBlock", referenced from:
            _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o)
        "_CMSampleBufferCreate", referenced from:
            _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o)
        "_CMVideoFormatDescriptionCreate", referenced from:
            _av_videotoolbox_default_init2 in libavcodec.a(videotoolbox.o)
        "_VTDecompressionSessionCreate", referenced from:
            _av_videotoolbox_default_init2 in libavcodec.a(videotoolbox.o)
        "_VTDecompressionSessionDecodeFrame", referenced from:
            _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o)
        "_VTDecompressionSessionInvalidate", referenced from:
            _av_videotoolbox_default_free in libavcodec.a(videotoolbox.o)
        "_VTDecompressionSessionWaitForAsynchronousFrames", referenced from:
            _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o)
        "_kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms", referenced from:
            _av_videotoolbox_default_init2 in libavcodec.a(videotoolbox.o)
      ld: symbol(s) not found for architecture x86_64
      clang: error: linker command failed with exit code 1 (use -v to see invocation)

      导入 CoreMedia.framework  编译

      Undefined symbols for architecture x86_64:
        "_VTDecompressionSessionCreate", referenced from:
            _av_videotoolbox_default_init2 in libavcodec.a(videotoolbox.o)
        "_VTDecompressionSessionDecodeFrame", referenced from:
            _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o)
        "_VTDecompressionSessionInvalidate", referenced from:
            _av_videotoolbox_default_free in libavcodec.a(videotoolbox.o)
        "_VTDecompressionSessionWaitForAsynchronousFrames", referenced from:
            _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o)
      ld: symbol(s) not found for architecture x86_64

      导入 VideoToolbox.framework  编译通过

  到此准备结束

原文地址:https://www.cnblogs.com/liyufeng2013/p/4286684.html