ffmpeg xcode 中的使用

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

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

  1. 编译ffmpeg.

    1. 下载源码后可以自己手动编译 ,反正是通过各种命令 配置configure
    2. 通过一个很牛逼的脚本:[email protected]: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  编译通过

  到此准备结束

时间: 2024-10-15 10:39:11

ffmpeg xcode 中的使用的相关文章

Xcode 中 Git 的配置与使用

Xcode 中 Git 的配置与使用主要围绕下面几个问题展开阐述: 问题1,如何在Xcode中创建本地代码库,并添加和提交代码到本地代码库? 问题2,如何在Xcode中提交推送给远程服务器代码库? 问题3,如何在Xcode中克隆远程服务器代码库到本地? 问题4,如何使用Xcode获取远程代码库数据,并解决冲突问题? 一.如何在Xcode中创建本地代码库,并添加和提交代码到本地代码库? 创建代码库有两种方式: 方式1:新建工程的时候创建 1. 勾选Create Git repository on

Xcode中如何在即将启动的APP中设置断点调试

在实际的App应用中,我们可能会碰到这么一种情况:我们设计一个APP,它可能会在外界发送某种消息或满足某种条件时,被动的启动加载,并根据外界传入的一些参数进行初始化工作. 这里由于程序是由其他程序启动的,所以我们不能够直接在XCode中编译运行程序并设置断点调试.但幸运的是,XCode提供了附加在进程上的调试功能,并且可以在进程启动前,通过进程名称等待进程运行,并在进程真正加载起来时,进入断点调试.具体方法如下: 1.在待调试的XCode中选择Debug->Attach to Process->

XCODE中使用Main.Storyboard拉入控件并实现事件(Swift语言)

如何在XCODE中的Main.Storyboard内拉入控件并实现一个简单的效果呢?本人由于刚接触Swift语言不久,对于IDE的操作还是很生疏,不懂了就在网上参考了网上前辈们的文章.以下我将演示如何用Swift语言配合Main.Storyboard演示一个小例子,对于新建一个SingleView Application在这里就不多说了. 创建好的应用程序已经自动创建好了一个和Main.Storyboard连接好的ViewController. 接下来我们在Main.Storyboard中的Vi

xCode中使用版本控制git

项目有多人协作的时候需要使用版本管理工具,常用的版本控制软件有git和svn. git的官网地址:http://git-scm.com/ svn地址:http://subversion.apache.org/ xcode中集成了git,而且使用起来非常简单.下面我就说说git的用法吧: 1.打开xcode,看到如下界面,见图一: 图一 选择"checkout an exitsting project",表示从服务器签出一个最新的版本. 我们选择即可,然后,顺利成章的找到了服务器的项目

iOS开发OC基础:Xcode中常见英文总结,OC常见英文错误

在开发的过程中难免会遇到很多的错误,可是当看到系统给出的英文时,又不知道是什么意思.所以这篇文章总结了Xcode中常见的一些英文单词及词组,可以帮助初学的人快速了解给出的提示.多练习,就肯定能基本掌握. expression:表达式assignable:赋值variable:变量redefinition:重复定义type:类型conflicting:冲突项invalid:无效的conversion:转换specifier:说明符indent:缩进operands:运算对象.操作数binary:二

XCode中Architecturs配置及常见问题

http://lanvige.github.io/2014/03/19/architecturs-in-xcode/ XCode 5.1升级后因arm64和CocoaPods的原因,痛了一天,终于解决了问题,同时也记录下这次的学习成果. ARMv6/7/7s & ARM64 在了解Architecture之前,先来认识这几个名字.armv6, armv7, armv7s, arm64是ARM CPU的不同指令集,就像CPU内潜入的软件版本.其在iPhone处理器型号为A4, A8… arm 芯片

Xcode中导入.a静态库后报错添加-force_load或-all_load

第一种方法: 以前在做项目的时候在Xcode中倒入一个三方SDK的时候,会有一些.a的静态库,这时候如果直接编译运行就会报错.当时只知道往build settings的linker flags 里面添加-force_load和.a文件的路径.最近又多次用到,这里总结一下. 例如在Xcode中倒入一个SIPSKDK,如下,这里面包含了一个.a的静态库. 如果直接运行的没用到里面方法的时候运行时没问题的,但是一旦导入头文件,并创建SIPClient对象的时候就会报错,如下所示: 这里报错的原因主要是

Xcode中使用GitHub详解

为了熟悉git命令及将写的小Demo能够管理起来方便日后查询,所以选择使用GitHub. 现在我们来说说Xcode中如何使用GitHub--- 一.当然是要先有GitHub帐号并登录了(没有的注册一个就行,在此不做介绍) 二.创建仓库 在GitHub右上角有一个加号+,点击向下的三角,可以看到下拉菜单,选择New repository,如下图: 根据界面提示,点击Create repository创建仓库成功,如下图: 三.查看/生成SSH私钥 在终端中输入ls ~/.ssh命令,如果呈现下图所

在Xcode中使用Git进行源码版本控制

在应用程序开发过程中,很重要的一部分工作就是如何进行源码的版本控制.当代码出现问题时,我们就需要将代码恢复到原先正常的版本.如果是多个人共同开发一个项目,那么代码的控制就会非常复杂.幸运的是,开发者不需要自己控制这些,因为有专门的软件来负责,叫做版本控制系统. 版本控制系统,或者说修改控制系统,实际上是一种检测源文件的改变并将其保存留作以后参考使用的机制(软件).此外,它还能记录其他有用信息,比如是哪个开发者修改了代码,何时修改的,修改了哪一部分,以及其他历史信息.版本控制系统可以比较不同版本代