您的位置:首页 > 移动开发 > IOS开发

编译ffmpeg for iOS,并调试iFrameExtractor demo

2012-09-12 15:14 537 查看
说明:本文部分内容参考互联网,亲自调整测试。

测试视频地址:http://livecdn.cdbs.com.cn/fmvideo.flv



(MBD,cnblogs上传图片功能都不能用了,还去sinaweibo发了张图。)

一、调试环境准备

1.操作系统:MacOS10.7.4

2.Xcode版本:Xcode4.4.1

3.确保xcode的CommandLineTools已安装,CommandLineTools位于Xcode->Perference->Downloads目录下

4.确保git工作正常,安装xcode后,在Terminal里git应该就可以正常工作了,如果工作不正常,可以到下面的链接下载gitformac:http://code.google.com/p/git-osx-installer/

二、下载代码

1.下载ffmpeg源代码

gitclonegit://source.ffmpeg.org/ffmpeg.gitffmpeg

参考:http://ffmpeg.org/download.html

2.下载ffmpeg-iphone-build

gitclonehttps://github.com/gabriel/ffmpeg-iphone-build.git
参考:https://github.com/gabriel/ffmpeg-iphone-build

三、编译

1.拷贝ffmpeg-iphone-build/gas-preprocessor.pl到/usr/sbin目录下

2.编译ffmpegforiOSi386版本

(1)将新下载的ffmpeg拷贝到ffmpeg-iphone-build目录下,改名为ffmpeg-i386

(2)用TextEdit打开build-i386文件注释#svnco-r22403svn://svn.ffmpeg.org/ffmpeg/trunk$FFMPEG_DIR这一行

(3)在CONFIGURE_OPTIONS里添加:--disable-asm--enable-cross-compile

(4)将./configure所在的行修改成:

./configure--cc=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc--as="$SCRIPT_DIR/gas-preprocessor.pl/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc"--extra-ldflags=-L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/usr/lib/system--sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk--extra-cflags="-mdynamic-no-pic"--prefix="dist"$CONFIGURE_OPTIONS--target-os=darwin--arch=i386--cpu=i386--extra-cflags='-archi386'--extra-ldflags='-archi386'


(4)在Terminal里运行./build-i386

3编译ffmpegforiOSarmv7版本

(1)将新下载的ffmpeg拷贝到ffmpeg-iphone-build目录下,改名为ffmpeg-armv7

(2)用TextEdit打开build-armv7文件注释#svnco-r22403svn://svn.ffmpeg.org/ffmpeg/trunk$FFMPEG_DIR这一行

(3)在CONFIGURE_OPTIONS里添加:--disable-asm--enable-cross-compile

(4)将./configure修改成:

./configure--cc=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc--as="$SCRIPT_DIR/gas-preprocessor.pl/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc"--extra-ldflags=-L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/system--sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk--extra-cflags="-mdynamic-no-pic"--prefix="dist"$CONFIGURE_OPTIONS--target-os=darwin--arch=armv7--cpu=armv7--extra-cflags='-archarmv7'--extra-ldflags='-archarmv7'


(5)在Terminal里运行./build-armv7

4编译ffmpegforiOSarmv6版本

(1)将新下载的ffmpeg拷贝到ffmpeg-iphone-build目录下,改名为ffmpeg-armv6

(2)用TextEdit打开build-armv6文件注释#svnco-r22403svn://svn.ffmpeg.org/ffmpeg/trunk$FFMPEG_DIR这一行

(3)在CONFIGURE_OPTIONS里添加--disable-asm--enable-cross-compile将

(4)./configure修改成:

./configure--cc=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc--as="$SCRIPT_DIR/gas-preprocessor.pl/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc"--extra-ldflags=-L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/system--sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk--extra-cflags="-mdynamic-no-pic"--prefix="dist"$CONFIGURE_OPTIONS--target-os=darwin--arch=armv6--cpu=armv6--extra-cflags='-archarmv6'--extra-ldflags='-archarmv6'


(5)在Terminal里运行./build-armv6

5合并armv6armv7i386创建fat类型的静态库

(1)创建build-universal文件。文件内容为

#!/bin/tcsh-f

mkdiruniversal

mkdirlib

mkdirarmv6

mkdirarmv7

mkdiri386

mvffmpeg-armv6/libavcodec/libavcodec.aarmv6/

mvffmpeg-armv6/libavdevice/libavdevice.aarmv6/

mvffmpeg-armv6/libavformat/libavformat.aarmv6/

mvffmpeg-armv6/libavutil/libavutil.aarmv6/

mvffmpeg-armv6/libswscale/libswscale.aarmv6/

mvffmpeg-armv7/libavcodec/libavcodec.aarmv7/

mvffmpeg-armv7/libavdevice/libavdevice.aarmv7/

mvffmpeg-armv7/libavformat/libavformat.aarmv7/

mvffmpeg-armv7/libavutil/libavutil.aarmv7/

mvffmpeg-armv7/libswscale/libswscale.aarmv7/

mvffmpeg-i386/libavcodec/libavcodec.ai386/

mvffmpeg-i386/libavdevice/libavdevice.ai386/

mvffmpeg-i386/libavformat/libavformat.ai386/

mvffmpeg-i386/libavutil/libavutil.ai386/

mvffmpeg-i386/libswscale/libswscale.ai386/

rmuniversal/*.a

lipo-create-archarmv6armv6/libavcodec.a-archarmv7armv7/libavcodec.a-archi386i386/libavcodec.a-outputuniversal/libavcodec.a

lipo-create-archarmv6armv6/libavdevice.a-archarmv7armv7/libavdevice.a-archi386i386/libavdevice.a-outputuniversal/libavdevice.a

lipo-create-archarmv6armv6/libavformat.a-archarmv7armv7/libavformat.a-archi386i386/libavformat.a-outputuniversal/libavformat.a

lipo-create-archarmv6armv6/libavutil.a-archarmv7armv7/libavutil.a-archi386i386/libavutil.a-outputuniversal/libavutil.a

lipo-create-archarmv6armv6/libswscale.a-archarmv7armv7/libswscale.a-archi386i386/libswscale.a-outputuniversal/libswscale.a

rmlib/*.a

cpuniversal/*.alib/


(2)运行build-universal文件./build-universal

此时,我们需要的都在lib/目录下

四、调试iFrameExtractordemo

可以参考开源示例iFrameExtractor(gitclonegit://github.com/lajos/iFrameExtractor.git)需要将该项目的ffmpeg文件夹库替换为你编译的ffmpeg源码文件夹,在ffmpeg目录下新建lib目录,将上一步编译在lib/目录下的静态库拷贝进去。打开项目,点击编译运行:出现####/iFrameExtractor/ffmpeg/libavutil/common.h:38:10:'libavutil/avconfig.h'filenotfound,可以新建avconfig.h文件,内容如下(也可以从ffmpeg-iphone-build/ffmpeg-i386/libavutil/avconfig.h下复制过去):

/*Generatedbyffconf*/
#ifndefAVUTIL_AVCONFIG_H
#defineAVUTIL_AVCONFIG_H
#defineAV_HAVE_BIGENDIAN0
#defineAV_HAVE_FAST_UNALIGNED0
#defineAV_HAVE_INCOMPATIBLE_FORK_ABI0
#endif/*AVUTIL_AVCONFIG_H*/


在xcode中继续运行,出现错误::Useofundeclaredidentifier'CODEC_TYPE_VIDEO'

解决办法:把iFrameExtractor中的CODEC_TYPE_VIDEO修改为AVMEDIA_TYPE_VIDEO。(注意如果使用的是版本<=ffmpeg0.8.5的库需要修改)

继续运行出现了一些错误,

Undefinedsymbolsforarchitecturei386:
"_BZ2_bzDecompress",referencedfrom:
_matroska_decode_bufferinlibavformat.a(matroskadec.o)
"_BZ2_bzDecompressEnd",referencedfrom:
_matroska_decode_bufferinlibavformat.a(matroskadec.o)
"_BZ2_bzDecompressInit",referencedfrom:
_matroska_decode_bufferinlibavformat.a(matroskadec.o)
"_av_open_input_file",referencedfrom:
-[VideoFrameExtractorinitWithVideo:]inVideoFrameExtractor.o
ld:symbol(s)notfoundforarchitecturei386
clang:error:linkercommandfailedwithexitcode1(use-vtoseeinvocation)


解决方法如下:

在项目中添加libbz2.1.0.dylib库。

继续执行,如出现如下错误:

Undefinedsymbolsforarchitecturei386:
"_av_open_input_file",referencedfrom:
-[VideoFrameExtractorinitWithVideo:]inVideoFrameExtractor.o




av_open_input_file(&pFormatCtx,[moviePathcStringUsingEncoding:NSASCIIStringEncoding],NULL,0,NULL)!=0替换成

avformat_open_input(&pFormatCtx,[moviePathcStringUsingEncoding:NSASCIIStringEncoding],NULL,NULL)!=0

此时运行成功,添加了几个网络地址flv测试能解码视频,但是没声音,有时会中断等问题,还有几个地方不替换会出现警告(我还不是很深入了解,就不写了)。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: