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  编译通过

      到此准备结束

  • 相关阅读:
    第一次学习打卡
    第一次Java作业
    浏览器兼容问题汇总
    js 获取js自身参数
    文字内容展开与折叠jquery代码
    Jquery DIV滚动至浏览器顶部位置固定
    js操作cookie方法
    利用CSS边框合并属性打造table细边框
    js获取当前日期及获取当前日期的前一天日期函数
    asp.net抓取网页html源代码失败 只因UserAgent作怪
  • 原文地址:https://www.cnblogs.com/liyufeng2013/p/4286684.html
Copyright © 2011-2022 走看看