zoukankan      html  css  js  c++  java
  • 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  编译通过

      到此准备结束

  • 相关阅读:
    PHP基本的语法以及和Java的差别
    Linux 性能測试工具
    【Oracle 集群】Linux下Oracle RAC集群搭建之Oracle DataBase安装(八)
    【Oracle 集群】Oracle 11G RAC教程之集群安装(七)
    【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
    Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
  • 原文地址:https://www.cnblogs.com/liyufeng2013/p/4286684.html
Copyright © 2011-2022 走看看