iOS: FFmpeg编译和使用问题总结 ( 一 )

一片枫叶

追求卓越,成功就会在不经意间追上你

跟随自己的节奏学习,思考,总结,找到自己,别人才会找到你

下一篇:基于NSBundle的工程结构


iOS: FFMpeg编译和使用问题总结

iOS: FFmpeg编译和使用问题总结

  

  折磨了我近一周多时间的FFmpeg库编译问题终于解决了,必须得把这一段时间来遇到过的坑全写出来。如果急着解决问题,编译最新版本的FFmpeg库请直接看第二部分,编译较老版本(0.7)的FFmpeg库请直接跳至第七部分,那里有你想要的编译脚本,但别忘了抽空看看全文。

 

一、背景

  网上有很多FFmpeg编译配置的资料,大部分都是关于FFmpeg最新的版本(2.0)的,我一开始也想着编写一个2.0版本的,可以放到接手的那个项目中,发现各种问题(无法快进,没有声音),再看一下代码一堆警告,原因很简单,使用的FFMpeg库太新了,很多接口变动了。由于手上没有多少信息,不知道那个项目使用的是哪个版本的FFmpeg库,一点点找,终于知道原来使用的是0.7.x的。找到目标版本的FFmpeg本以为万事大吉了,后来才发现原来这才是坑的开始,有历经一系列磨难,最后终于把编译问题解决了。

  

二、FFmpeg最新版本的库编译

  FFmpeg最新版本的应该是2.1的,历史版本详见http://www.ffmpeg.org/releases/,在这个网站上我们可以下到所有历史版本的库。FFmpeg是一个跨平台的用C语言写成的库,包含了编码,解码,色彩空间转换等库。编译需要用到命令行,对于我们这些没搞过后台或者linux开发的脚本知识欠缺的人来说的确算是一个挑战。庆幸的是现在网络这么方便,不会做问Google,很快就找到了一个在xcode5下一键编译FFmpeg库的脚本。这个脚本是个老外写的,真心强大,从下载到编译到构建最后的Fat库一气呵成。

  脚本地址: https://gist.github.com/m1entus/6983547

  运行这个脚本需要依赖一个库Perl写的脚本,搜了一下网上目前编译FFmpeg库的帖子基本都会提到这个脚本,脚本地址如下: https://github.com/mansr/gas-preprocessor

  下载完这两个脚本后,编译FFmpeg库的准备工作就基本完成了,接着依次执行下面几步:

  1、拷贝gas-preprocessor.pl文件到 /usr/bin目录下。

  2、修改gas-preprocessor.pl文件的权限

  注:需要有读,写和执行的权限。具体操作为,首先在命令行下进入/usr/bin目录,然后执行chmod命令,如下图所示:

  3、切换build-ffmpeg.sh脚本的目录下,使用命令sh build-ffmpeg.sh 运行该脚本即可。

  注:  1) build-ffmpeg.sh脚本的父目录的名字不能包括空格,否则可能导致构建失败。

      2) build-ffmpeg.sh脚本中可以配置编译的FFMpeg版本,以及使用iOS SDK的版本,如下图所示:

  该脚本中默认采用的FFmpeg是2.0版本,使用iOS 7.0的SDK编译,c语言编译器采用clang,应用中可以根据实际项目需要选中不同的FFmpeg和iOS SDK版本。

  根据上面的步骤看来,编译工作也没有什么复杂的,为什么我会说踩了很多坑呢?这个问题我会一点点儿解释。

三、编译较早期版本的FFmpeg本库

  第二部分中我们介绍了一个牛逼的脚本,一键编译,这给我们造成了一种错觉,FFmpeg编译不过如此吗!如果我们尝试一下把脚本中的VERSION变成0.7试试,运行脚本,发现编译报错。如下图所示:

  提示位置选项--disable-iconv,根据提示我们输入./configure查看所有可用选项。命令行下切换到实际的FFmpeg源码目录下,查看帮助如下图:

  我们可以看到很多选项,英语不难,就是有些选项描述的太简洁了,所以实际使用时如果不确定的话,我们可以去问问google。

  好了回过头来看看这个configure文件到底有什么作用呢?

  1、裁剪

  我们知道FFmpeg库是一个非常庞大的库,包括编码,解码以及流媒体的支持等,如果不做裁剪全部编译进来的话,最后生成的静态库会很大。实际使用中我们可能只想用到解码(例如播放器),因此我们可以使用相关选项指定编译时禁用编码部分。当然我们还可以做进一步的裁剪,例如只打开部分常用格式的解码,禁用掉其他的解码,这样编译出来的静态库将会更小。

  要想裁剪,我们的先知道有哪些部分,使用下面的命令可以查看FFMpeg库支持的组件列表。


1

2

3

4

5

6

7

8

9

10

11

--list-decoders          show all available decoders

--list-encoders          show all available encoders

--list-hwaccels          show all available hardware accelerators

--list-muxers            show all available muxers

--list-demuxers          show all available demuxers

--list-parsers           show all available parsers

--list-protocols         show all available protocols

--list-bsfs              show all available bitstream filters

--list-indevs            show all available input devices

--list-outdevs           show all available output devices

--list-filters           show all available filters

  我们可以根据实际需要把不用的部分都禁用掉,这样编译快,包也会比较小,常用的裁剪选项如下:


1

2

3

4

5

6

7

8

9

10

11

12

--disable-doc            do not build documentation

--disable-ffmpeg         disable ffmpeg build

--disable-ffplay         disable ffplay build

--disable-ffserver       disable ffserver build

--disable-network        disable network support [no]

--disable-encoder=NAME   disable encoder NAME

--enable-encoder=NAME    enable encoder NAME

--disable-encoders       disable all encoders

--disable-decoder=NAME   disable decoder NAME

--enable-decoder=NAME    enable decoder NAME

--disable-decoders       disable all decoders

--disable-hwaccel=NAME   disable hwaccel 

  举个例子,如果我们需要做一款本地视频播放器,那么我们可以使用如下配置:

  

  当然你还可以根据帮助列表进行更细粒度的裁剪,例如只支持哪几种格式的解码等等。

  2、指定编译环境

  FFMpeg作为一个跨平台的库,不同的平台,不同的人的计算机上编译器的路径都可能不尽相同,所以我们需要为编译脚本指定编译器的路径。同事我们还可以指定其他编译选项,如是否交叉编译,目标平台系统,CPU架构,需要依赖的其他库的路径已经指定是否禁用汇编优化等。


1

2

3

4

5

6

7

8

9

10

11

--enable-cross-compile   assume a cross-compiler is used

--sysroot=PATH           root of cross-build tree

--sysinclude=PATH        location of cross-build system headers

--target-os=OS           compiler targets OS []

--cc=CC                  use C compiler CC [gcc]

--extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS []

--extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS []

--arch=ARCH              select architecture []

--cpu=CPU                select the minimum required CPU (affects

                         instruction selection, may crash on older CPUs)

--disable-asm            disable all assembler optimizations

  sysroot即iOS SDK的路径,注意编译真机版本的库时需要使用iPhoneOS.platform中SDK的路径,编译模拟器版本的库使用iPhoneSimulator.platform中SDK的路径。target-os填写darwin(苹果系统的内核),arch可以根据具体的情况添加i386(模拟器),armv6,armv7等。cpu根据具体类型可填写cortex-a8,cortox-a9,i386等。   

  3、指定静态库的安装路径

  指定执行make install命令时编译好的静态库和相关头文件拷贝到的位置,即FFmpeg库编译后输出的路径。通常我们只需要设置“--prefix=PREFIX”选项即可。例如我们需要将最后生成静态库的路径指向“build/armv7”下,则设置--prefix="build/armv7";

   

四、FFmpeg0.7版本库一键编译脚本

  通过第三部分的介绍,相信我们应该对FFmpeg的配置都有了一个初步的认识,我们再回到第三部分开始时我们运行build-ffmpeg.sh的碰到的问题,经过查看configure的帮助,我们发现0.7这个版本的FFmpeg库却是没有"--disable-iconv"选项。这个牛逼的脚本是针对当前较新的FFmpeg库写的,在低版本中没有一些配置选项也是正常。

  下面给出经过修改后的脚本,脚本中对原先的脚本进行了精简,去掉了下载部分的代码。

 build-ffmpeg0.7

  注:由于FFmpeg库比较陈旧,该脚本使用xcode4.6下,编译器为GCC,采用6.1的SDK进行编译。如果你的机器上装的同事安装了xcode4.x和xcode5的话,可以在命令行下使用如下命令切换当前的默认编译环境为xcode4.6即可:

  设置好xcode的编译环境以后,只需要将该脚本拷贝到FFMpeg源文件路径下运行即可一键生成armv7,armv7s,i386以及合成后的全平台库。

五、如何使用以及编译链接中可能遇到的问题

  第四部分中我们对build-ffmpeg.sh的脚本进行了修改和精简后得到了build-ffmpeg0.7.sh,我们只需要运行该脚本就可以一键完成FFmpeg 0.7版本库的编译工作了。编译后我们得到的是lib目录(包含所有生成的静态库)以及include目录(包含相应的头文件),使用时我们只需要将这些文件添加到工程中即可。

  问题到这里似乎就全部解决了,如果顺利的话,恭喜你,你可以直接使用了。

  如果你跟我一样的"不幸"的话,可能还会遇到一些其他问题。下面是我遇到的问题及解决办法:

  1、time.h重复问题

  我们知道一般静态库都是搭配头文件使用的,要在项目里面使用FFmpeg库,我们出了需要在xcode的build phases中添加静态库以外,还需要导入该库对应的头文件。FFmpeg库对应的头文件有很多,通常会采用设置header search path的方式来导入头文件,这样做有两个好处: 第一可以避免对我们的工程结构造成干扰。第二可以在一定程序上降低头文件冲突。

  time.h冲突的问题就是属于头文件冲突,系统的标准库中有time.h文件,FFmpeg应该是在1.1之后也加入了一个time.h文件,路径为libavutil/time.h。所以如果你使用的是FFmpeg1.1之后的版本,那么在使用中就可能会碰到头文件冲突的问题。解决这个问题,网上流传一个方法是修改FFmpeg库中time.h文件的名字,我觉得这太麻烦了,而且也容易出错。后来查看FFmpeg源码的时候偶然发现它自身内部引用这个time.h的时候都有带一层父目录,如#include "libavutil/time.h"。因此想是不是通过指定头文件搜索路径就可以解决这个问题。

  打开工程设置页面,搜索header search path如下图所示:

  如果你的FFmpeg库正好是放在当前的路径下,且为了偷懒设置了递归包含头文件的话,那么你很可能就会遇到time.h冲突的问题。因为xcode工程默认的设置是优先查找用户路径,编译时FFmpeg中libavutil下的time.h就会优先被链接,从而导致不会再链接系统time.h文件,最终导致编译失败。

  解决这个问题有两个办法:

  a、取消掉Header Search Paths中的递归引用。

  b、设置Always Search User Paths为NO。

  2、gcc c compiletest error问题
  xcode5下面编译FFmpeg都采用clang,同样也会遇到类似问题。这个问题通常出现在配置文件错误的情况下,一般都是gcc路径错误,当然也可能是其他编译参数错误问题。

  出现这个问题我们应该首先检查gcc的路径是否正确,如果确认了指定路径上存在gcc程序,但是还是报错的,我们再去检查当前要编译的平台和指定的gcc路径是否一致,如果你使用iPhoneOS.platform下面的gcc去编译i386平台的库那肯定是不会测试通过的。

  3、C compiler test failed问题
  编译i386版本的FFmpeg库和armv版本库可能用到的参数不尽相同,例如我遇到这个问题,我的编译选项中有一项如下:

  --extra-cflags=‘-arch i386 -mfloat-abi=softfp -miphoneos-version-min=5.0‘

  在我确认其他参数(如cpu,arch)都正确的情况下,依然提示我们“C compiler test failed.” 后面紧跟着一句查看config.log你可以得到更详细的信息,于是打开该文件,你可以在最开始的地方看到你的配置语句,如果是用脚本,这块儿会显示最终解释后(替换参数为真实值)的配置语句。然后紧跟着一堆具体的配置,通常哭啼的错误信息会在该文件的最末尾。我遇到的问题的信息如下:

  

  看到标红的这个区域了没有,提示“-mfloat-abi=softfp”选项不支持,删掉该选项后,在运行时配置就通过了。其他配置问题,都可以通过查看config.log来获取更详细的错误信息。

  4、由于未导入libbz动态库的问题

  如果导入FFmpeg库了,并且配置了头文件搜索路径,遇到"Undefined symbols for architecture armv7s: _BZ2_bzDecompressInit",如下图所示:

  这个问题是由于没有导入“libbz2.dylib”库的原因,导入库即可解决该问题。

  5、libavcodec/audioconvert.h头文件缺失问题

  不知道为什么执行make install的时候libavcodec中的audioconvert.h怎么没有拷贝到include目录下的libavcodec中去,查看发现原来libavutil目录下已经有一个audioconvert.h了。解决这个问题只需要从FFmpeg库的libavcodec中拷贝audioconvert.h头文件到include的libavcodec目录中即可解决。

六、杂谈

  感谢我所遭遇的"不幸",如果当时接受的项目使用的最新版本的FFmpeg库,我可能就直接运行一下那个牛逼的脚本,然后一切就可以顺顺利利。如果真是那样的话,我可能也就不会花时间去学习基本的脚本知识,去了解FFmpeg库的相关配置,这样的结果就是下次当我中奖遇到FFmpeg库编译链接等问题时,只能束手无策。

  说了这么多,当我们使用一个技术的时候,不应该仅仅停留在会用的层次,花点儿时间了解一下背后的原理会更让你对该技术有个更深的理解,多学,多看,多思考,最终会有有所收获的。

七、编译脚本及参考资料

  1、编译脚本  

  gas-preprocessor脚本地址: https://github.com/mansr/gas-preprocessor  

  FFmpeg 2.x一键化编译脚本: https://gist.github.com/m1entus/6983547

  FFmpeg0.7一键化编译脚本: https://gist.github.com/smileEvday/7565260

  2、参考资料

  模拟器与真机下ffmpeg的编译方法(总结版)

  http://www.cocoachina.com/iphonedev/toolthain/2011/1020/3395.html

  编译在ios4.3中使用的ffmpeg库(转)

  http://www.cocoachina.com/bbs/simple/?t70887.html

  Installing ffmpeg ios libraries armv7, armv7s, i386 and universal on Mac with 10.8

  http://stackoverflow.com/questions/18003034/installing-ffmpeg-ios-libraries-armv7-armv7s-i386-and-universal-on-mac-with-10/19370679#19370679

分类: iOS

标签: IOSffmpeg编译编译问题gcctime.h重复ffmpeg 0.7gcc c compiletest errorC compiler test failed

绿色通道: 好文要顶 关注我 收藏该文与我联系 

一片-枫叶
关注 - 49
粉丝 - 250

+加关注

6

0

(请您对文章做出评价)

«上一篇:iOS7: 如何获取不变的UDID
»下一篇:这半年我为什么没有更新博客

posted on 2013-11-21 00:05 一片-枫叶 阅读(10487) 评论(44)  编辑 收藏

评论

#1楼 2013-11-21 11:47 dreamhappy

我在windows服务器上 使用ffmpeg.exe 格式转换视频过程中 cpu总是飙到95% 以上,不知道你可有什么解决方法?

支持(0)反对(0)

#2楼[楼主] 2013-11-21 14:57 一片-枫叶

@dreamhappy
windows上的还没搞过,这个问题还真没法回答你

支持(0)反对(0)

#3楼 2013-12-11 14:39 三毛大哥80

按照那个什么自动脚本,我这报的错误:
macmatoMac-Pro:Downloads mac$ sh build-ffmpeg.sh 
: command not foundne 2: 
: command not foundne 15: 
: command not foundne 19: 
: command not foundne 21: 
: No such file or directoryd: .
: command not foundne 24: 
: command not foundne 30: 
: command not foundne 31: 
: command not foundne 34: 
: command not foundne 41: 
: command not foundne 43: 
: command not foundne 45: 
: invalid option line 47: set: -
set: usage: set [--abefhkmnptuvxBCHP] [-o option] [arg ...]

支持(0)反对(0)

#4楼 2013-12-11 14:52 三毛大哥80

第2,15,19都没有脚本,是注释或者空行,不知道他错误是怎么报出来的

支持(0)反对(0)

#5楼[楼主] 2013-12-11 19:48 一片-枫叶

@三毛大哥80
你用的是https://gist.github.com/m1entus/6983547 这个脚本吧

支持(0)反对(0)

#6楼 2013-12-12 10:26 三毛大哥80

是的,用的这个脚本

支持(0)反对(0)

#7楼[楼主] 2013-12-13 15:12 一片-枫叶

@三毛大哥80
这个脚本我试了,没有问题的,你看看是不是有非法字符在里面,下载下来有编辑过吗?

支持(0)反对(0)

#8楼 2014-01-02 23:51 龙象般若

根据博主的教程,我第一步执行完后怎么木有看见.a文件呢

支持(0)反对(0)

#9楼[楼主] 2014-01-07 09:33 一片-枫叶

@龙象般若
具体一点,报什么错?

支持(0)反对(0)

#10楼 2014-01-07 15:40 吴春艺

--list-hwaccels show all available hardware accelerators
--list-muxers show all available muxers
--list-demuxers show all available demuxers
--list-parsers show all available parsers
--list-protocols show all available protocols
--list-bsfs show all available bitstream filters
--list-indevs show all available input devices
--list-outdevs show all available output devices
--list-filters show all available filters 
这几个都是干什么用的啊?

支持(0)反对(0)

#11楼 2014-01-07 15:41 吴春艺

我想都禁掉,但是用ffmpeg.c得时候会报错,如果不禁掉静态库文件又太大。。做编解码可以禁掉哪些东西啊?

支持(0)反对(0)

#12楼 2014-01-07 16:20 飘荡的云

楼主,您好,我在执行这个脚本的时候 第一项怎么是去下载呢 
Downloading ffmpeg-2.0.2.tar.bz2
我是将脚本放到我下载的最新版本的ffmpeg中了 但为什么还是去下载呢,为什么不下载最新版本的2.1呢,谢谢了

支持(0)反对(0)

#13楼 2014-01-07 16:29 飘荡的云

不好意思楼主 还得再请教一下 这个编译出来的能兼容arm64的吗,还有能不能修改一下脚本,去掉支持模拟器的编译呢,这样库是不是就小点了呢 谢谢了

支持(0)反对(0)

#14楼 2014-01-07 16:50 飘荡的云

第一个问题 已经解决了 怪我没有仔细看代码 就冒昧的问问题了 不好意思 楼主

支持(0)反对(0)

#15楼[楼主] 2014-01-07 19:43 一片-枫叶

@飘荡的云
arm64可以兼容的,向下兼容而已,就像ios 7的系统可以跑6的sdk编写的程序一样。
可以修改脚本去掉模拟器支持,库是会小一点儿。不过根据实际经验在你编译成最终ipa上传的时候一般都会只支持真机,这个库也会根据需要链接的,不会影响最终ipa的大小

支持(0)反对(0)

#16楼[楼主] 2014-01-07 19:45 一片-枫叶

@吴春艺
引用--list-hwaccels show all available hardware accelerators
--list-muxers show all available muxers
--list-demuxers show all available demuxers
--list-parsers show all available parsers
--list-protocols show all available protocols
--list-bsfs ...

这几个跟list-decoders一样就是显示支持的合成器列表,根据实际需要禁掉就好了,具体的要看情况

支持(0)反对(0)

#17楼 2014-01-08 09:51 飘荡的云

群主你好,我在arm64位的机器上测试了一下,没法运行,直接报错的
ld: warning: ld: warning: ignoring file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavfilter.a, missing required architecture arm64 in file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavfilter.a (3 slices)ignoring file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libswresample.a, missing required architecture arm64 in file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libswresample.a (3 slices)

ld: warning: ignoring file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavformat.a, missing required architecture arm64 in file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavformat.a (3 slices)
ld: warning: ignoring file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavdevice.a, missing required architecture arm64 in file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavdevice.a (3 slices)
ld: warning: ignoring file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavresample.a, missing required architecture arm64 in file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavresample.a (3 slices)
ld: warning: ignoring file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavutil.a, missing required architecture arm64 in file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavutil.a (3 slices)
ld: warning: ignoring file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavcodec.a, missing required architecture arm64 in file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libavcodec.a (3 slices)
ld: warning: ignoring file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libswscale.a, missing required architecture arm64 in file /Users/user/Desktop/公司资料/code/高清摄像头/PlayerUseImage/PlayerUseImage/libs/libswscale.a (3 slices)
Undefined symbols for architecture arm64:
"_av_init_packet", referenced from:
-[VideoDecoder decodeWithData:] in VideoDecoder.o
"_avcodec_alloc_frame", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_sws_scale", referenced from:
-[VideoDecoder decodeWithData:] in VideoDecoder.o
"_avcodec_alloc_context3", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_av_free_packet", referenced from:
-[VideoDecoder decodeWithData:] in VideoDecoder.o
"_avcodec_open2", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_avpicture_alloc", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_av_register_all", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_avcodec_find_decoder", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_avpicture_free", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_sws_freeContext", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_avcodec_decode_video2", referenced from:
-[VideoDecoder decodeWithData:] in VideoDecoder.o
"_avcodec_register_all", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_sws_getContext", referenced from:
-[VideoDecoder init] in VideoDecoder.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如果我把arm64位去掉的话,错误和警告就没了,但是我觉得这不是长久之计,所以我觉得还是现在解决一下比较好,我在网上找到了一个编译ffmpeg arm64的,不是很懂,楼主可否将这两个综合一下呢,将arm64的编译挪到你现在的脚本中,网址如下:https://github.com/kewlbear/FFmpeg-iOS-build-script
谢谢了

支持(0)反对(0)

#18楼[楼主] 2014-01-08 13:00 一片-枫叶

@飘荡的云
你编译的是0.7版本的还是2.0?

支持(0)反对(0)

#19楼 2014-01-08 13:09 飘荡的云

@一片-枫叶
您好,楼主,是2.1的,我之前用的1.2也是这个问题,所以我换成2.1的试试,也是一样的问题哈

支持(0)反对(0)

#20楼 2014-01-08 13:17 飘荡的云

@一片-枫叶
2.1有问题,不如之前的1.2版本问题,之前的1.2如果我穿进去的数据不是一帧的话,不会崩溃的,2.1的会崩溃,之前每秒10帧,一点问题没有,用了2.1的话,也会崩溃,提示
[h264 @ 0x1d98ec00] corrupted macroblock 24 4 (total_coeff=-1)
[h264 @ 0x1d98ec00] error while decoding MB 24 4
[h264 @ 0x1d98ec00] concealing 3305 DC, 3305 AC, 3305 MV errors in I frame
[h264 @ 0x1d98ec00] no frame!
这种错误,貌似因为我传进的速度,大于他的解码速度了,导致出现这个问题的,不知道为何们2.1的解码速度这么慢呢 楼主能加我qq吗(532917100)谢谢了

支持(0)反对(0)

#21楼[楼主] 2014-01-08 14:18 一片-枫叶

@飘荡的云
具体的解码我也不懂,要支持arm64的话,直接在脚本最开始的地方armv7,armv7s 后面加上arm64应该就可以了

支持(0)反对(0)

#22楼 2014-01-08 14:25 飘荡的云

@一片-枫叶
这个我试了哈 楼主 把i386改成arm64位了,但是最后没有生成啊 看来还是需要改一些东西的啊

支持(0)反对(0)

#23楼[楼主] 2014-01-09 08:59 一片-枫叶

@飘荡的云
我今天抽空看看,改好了qq通知你

支持(0)反对(0)

#24楼 2014-01-09 09:06 飘荡的云

@一片-枫叶
恩恩,谢谢你,楼主

支持(0)反对(0)

#25楼 2014-02-13 10:42 码农张三丰

楼主 我的报这个错是怎么回事
Building without ccache
./configure: line 2870: /Users/zhangyu/Xcode5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang: No such file or directory
./configure: line 2870: /Users/zhangyu/Xcode5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang: No such file or directory
/Users/zhangyu/Xcode5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang is unable to create an executable file.
C compiler test failed.

支持(0)反对(0)

#26楼[楼主] 2014-02-13 15:40 一片-枫叶

@码农张三丰
路径错误
/Users/zhangyu/Xcode5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
找不到Clang,你看看这个路径下有吗?

支持(0)反对(0)

#27楼 2014-02-13 15:44 码农张三丰

@一片-枫叶
我的Xcode是Xcode5版本的 但是名字是Xcode这样有问题吗?
如果是Xcode下面是有这个路径的啊

支持(0)反对(1)

#28楼[楼主] 2014-02-14 12:35 一片-枫叶

那你就把/Users/zhangyu/Xcode5.app/ --》/Users/zhangyu/Xcode.app/

支持(0)反对(0)

#29楼 2014-03-24 09:03 vale_1988

谢谢楼主经验分享,我在运行脚本时遇到这个错误:
Using ffmpeg-2.1.4.tar.bz2
Building without ccache
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang is unable to create an executable file.
C compiler test failed.

请问是啥问题引起的?我的环境是 Mac OX 10.9,Xcode5.1
------------------------------------------------------------
把脚本里的路径一个个打印下来,发现原来是Xcode5.1中装的是iOS7.1的SDK,而不是iOS7.0的SDK。谢谢。
-------------------------------------------------------
还是有问题 后加入 " --disable-armv6 \
--disable-armv6t2 \" 这两个参数就好了。
再次感谢。

支持(0)反对(0)

#30楼 2014-04-21 18:23 lzh01

armv7
armv7s
i386
universal

博主,这是我生成的文件,我是不是需要合成一个啊?我怎么合成?

支持(0)反对(0)

#31楼 2014-04-21 19:27 lzh01

集合到iFrameExtractor 怎么都没有画质的,就一片默认颜色!log提示
[swscaler @ 0xd0fb600] No accelerated colorspace conversion found from yuv420p to rgb24.
不知道大家有没有遇到这样的问题!
我使用编译后的库是universal

支持(0)反对(0)

#32楼[楼主] 2014-04-22 11:12 一片-枫叶

@lzh01
universal里面的就是合成好的库

支持(0)反对(0)

#33楼 2014-04-24 14:43 lzh01

@一片-枫叶
谢谢博主!
还有一个问题,按照http://www.cnblogs.com/ikodota/archive/2012/09/12/compile_ffmpeg_for_iOS.html
的教程,编译总报
Configure options: --disable-asm --enable-cross-compile --enable-gpl --enable-postproc --enable-swscale --enable-avfilter
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc is unable to create an executable file.
C compiler test failed.
错误!不知博主是否也遇到过!

支持(0)反对(0)

#34楼[楼主] 2014-04-24 18:31 一片-枫叶

@lzh01
参数不对,或者版本不对应,之前我遇到过只有画面没有声音的问题

支持(0)反对(0)

#35楼 2014-04-25 16:53 lzh01

@一片-枫叶
我发现我编译都没通过!错误都是
Configure options: --disable-asm --enable-cross-compile --enable-gpl --enable-postproc --enable-swscale --enable-avfilter
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc is unable to create an executable file.
C compiler test failed.

支持(0)反对(0)

#36楼 2014-05-07 11:55 骑驴追火箭

@一片-枫叶
出现这个问题是什么原因啊
liangyingjundeMacBook-Pro:ffmpeg-2.0.2 Onery$ xcode -s /Applications/Xcode5.1.app/Contents/Developer

-bash: xcode: command not found

支持(0)反对(0)

#37楼 2014-09-11 17:58 遇则安

博主,感谢分享。
看完这篇博客后深受启发,但按照文中步骤编译时总是有问题。iOS sdk:7.1,ffmpeg:2.3.3,Xcode 5.1.1,每次都是gas-preprocessor报错,刚开始说找不到这个文件,然后将build-ffmpeg.sh脚本中的gas-preprocessor路径改为/usr/bin/gas-preprocessor,然后显示gas-preprocessor的第88行报错。对应的文件都是在博文中的链接下载的,报错信息在ffmpeg/config.log中看的。然后看到一些博客中说Xcode5以上不在需要gas-preprocessor文件了,于是把build-ffmpeg.sh脚本中关于gas-preprocessor的“--as=‘/usr/local/bin/gas-preprocessor.pl‘”删掉后,终于编译成功了。不知道在使用过程中还会遇到什么问题。

支持(0)反对(0)

#38楼 2014-11-21 15:25 广州-小a

楼主!你好!
我现在将ffmpeg编译好之后,想将自己编写的sdk.c等其他c源文件(调用到了ffmpeg里面的方法)进一步编译成一个库,最后供后续调用,那么现在想进一步编译库,应该怎么做?

支持(0)反对(0)

#39楼 2014-11-27 09:41 他三叔走啊

大侠 照着你的帖子 编译成功了 但是导入项目之后 不知道怎么用 能给讲讲吗 我要做图片合成视频的功能 谢谢了 我QQ490849131

支持(0)反对(0)

#40楼[楼主] 2014-11-28 09:23 一片-枫叶

@广州-小a
新建静态库工程,导入你编译好的ffmpeg的静态库,加上你的SDK。c,然后后输出一个工程
当然ffmpeg的头文件也是需要输出的,具体的工程设置google一下

支持(0)反对(0)

#41楼[楼主] 2014-11-28 09:23 一片-枫叶

@他三叔走啊
具体点,为什么不能用呢?

支持(0)反对(0)

#42楼 2014-11-28 09:34 他三叔走啊

@一片-枫叶
可以用 是我不会用 我要做的功能是 多张图片合成视频 能指点一下么? 我QQ490849131 谢谢了

支持(0)反对(0)

#43楼 2014-12-02 16:17 他三叔走啊

博主 你好 我想问问 知道怎么在代码里调用ffmpeg的命令吗?

支持(0)反对(0)

#44楼 2014-12-02 16:24 paschal

@vale_1988
我也是你这错误,我改了好多还是不行,求指点

时间: 2024-11-11 23:40:47

iOS: FFmpeg编译和使用问题总结 ( 一 )的相关文章

iOS: FFmpeg编译和使用 学习

ffmpeg是一个多平台多媒体处理工具,处理视频和音频的功能非常强大.目前在网上搜到的iOS上使用FFMPEG的资料都比较陈旧,而FFMPEG更新迭代比较快: 且网上的讲解不够详细,对于初次接触FFMPEG的新手(例如我)来说确实不太好使用.为了防止忘记,这里对iOS下使用FFMPEG做一个总结. 1. FFMPEG层次结构的简单理解 要使用FFMPEG,首先需要理解FFMPEG的代码结构.根据志哥的提示,ffmpeg的代码是包括两部分的,一部分是library,一部分是tool.api都是在l

iOS ffmpeg编译,C compiler test failed.问题

如何编译ffmpeg 使用大牛编写的自动化脚本 脚本地址: https://gist.github.com/m1entus/6983547 运行这个脚本需要依赖一个库Perl写的脚本,搜了一下网上目前编译FFmpeg库的帖子基本都会提到这个脚本,脚本地址如下: https://github.com/mansr/gas-preprocessor. 下载完这两个脚本后,编译FFmpeg库的准备工作就基本完成了,接着依次执行下面几步: 1.拷贝gas-preprocessor.pl文件到 /usr/b

iOS下编译ffmpeg

网络上搜索“ios ffmpeg 编译”,文章一大把,但我编译还是费了很大的功夫才编译成功.很多文章只是把步骤列了出来,但是每个人的系统环境,或者程序版本都不一样,结果出现各种的错误.我把自己编译过程中碰到错误以及解决办法写出来,希望有需要的朋友少走弯路. 1.下载ffmpegc-master包 ffmpegc-master github链接:https://github.com/lvjian700/ffmpegc 包里面已经包含了install-gas.sh和install-ffmpeg.sh

如何把iOS代码编译为Android应用

新闻 <iPhone 6/6 Plus中国销量曝光:单月销量650万>:据iSuppli Corp.中国研究总监王阳爆料,iPhone 6和iPhone 6 Plus在国内受欢迎的情况大大超过预期,苹果在中国的单月销量在11月超过了650万台,全年在中国的销量将超过4000万台. 教程 < Date parsing performance on iOS>:文章介绍了一个关于格式化时间的”黑科技“,作者使用 sqlite 替换 NSDateFormatter,提高了16倍的转换效率.

【FFmpeg】Windows下FFmpeg编译

转自:http://www.cnblogs.com/dwdxdy/p/3625766.html 由于FFmpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译,需要在Windows下配置一个类似Linux的编译环境.本文主要记录Windows下FFmpeg编译的过程. 1.资源准备 准备编译过程所需的软件工具和源代码. (1). MinGW-MSYS Bundle http://sourcef

转载:ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复

转载自:http://www.cnblogs.com/dabaopku/archive/2012/12/12/2813940.html ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复 问题 -all_load 是在Objective-C 编译时常用到的一个参数,比如这篇文章所介绍的,生成静态库的一些问题-all_load.但是我们在加入这个参数后,有时会出现"ld: duplicate symbol _main"的错误

ios下编译opencv

如果想要在ios下编译opencv 需要安装Cmake 这里通过homebrew 来安装cmake ios下打开终端然后先安装 homebrew :(mac 下自带ruby) ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 然后安装Cmake: brew install cmake 装好cmake之后就可以使用git 下载opencv 源码了具体操作如下:

ios Xcode编译错误

[BEROR]CodeSign error: code signing is requiredfor product type 'Application' in SDK 'iOS 7.1' xcode编译出现这个错误,我的做法是,附图 ios Xcode编译错误

ubuntu下FFMPEG编译安装

ubuntu FFMPEG编译安装 声明:转载请注明出处,谢谢! 此处把软件的安装路径指定到 $HOME/ffmpeg_build 软件包统一放在: $HOME/ffmpeg_sources 最终编译的ffmpeg/ffmplay/ffserver将放在 $HOME/bin 1.lame (--enable-libmp3lame) 安装包下载路径: http://ncu.dl.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz #