使用ffmpeg进行音视频开发,首先编译需要把ffmpeg的源码编译成静态库,编译不是大问题,关键问题是编译的时候的各种配置该怎么设置的问题。之前在网上搜索学习,这篇文章不错:iOS: FFmpeg编译和使用问题总结 。有些文章给出编译的整个命令,有的给脚本链接,但是都有一些问题,因为ffmpeg版本更新了、iOS版本更新了(我下的是ffmpeg2.3)。最后东拼西凑,终于编译成功了一个,编译命令是:
(1)
./configure --prefix=../i386 --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --enable-avresample --enable-cross-compile --sysroot="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk" --target-os=darwin --cc="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" --extra-cflags="-arch i386 -mfpu=neon -miphoneos-version-min=7.0" --extra-ldflags="-arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk -miphoneos-version-min=7.0" --arch=i386 --cpu=i386 --enable-pic --disable-asm --enable-decoder=h264 --enable-decoder=rv40
(2)sudo make&&sudo make install
1、完整过程:
首先编译是使用终端进行编译,打开终端后,进入到你下载解压后的ffmpeg的文件目录下,然后执行上面的命令。(1)部分是配置,(2)部分 make执行后会开始编译,会看到迅速生成许多 cc 开头的命令;make install生成静态库,完成。
后面编译完成,加到项目中也OK了,但是一看大小,我靠,200多M,没办法,来研究下配置项,看看怎么把不必要的内容不变异进来。所以了解了下各个命令的意思。
2、各个命令:
(1)首先,每个单独的配置项之间是隔了一个空格的,这是一个需要注意的问题,怕手一抖,把两条命令贴在了一起,比如
--disable-ffmpeg --disable-ffplay 写成了--disable-ffmpeg--disable-ffplay
然后编译的时候,报错说不识别--disable-ffmpeg--disable-ffplay,你还以为自己这两条命令打错了,其实系统是把它看成了一条命令。(2)--prefix=后面跟的是编译成功后静态库存放的路径,可以自己新建一个文件夹,拖进来就可以了。
(3)然后是一连串--disable-xxx或--enable-xxx这种格式的东西,就是这些影响了编译后库里面的东西,disable是不编译xxx,anable是编译xxx。不过这里有个要注意的,比如解码方式你只需要h264,不想把其他东西解码方式编译进来怎么办,使用:
--disable-decoders 和 --enable-decoder=h264结合。前面一句其实是禁用了所有的解码方式,然后你再编译某一种解码方式,这样就只有这一种解码方式编译进来,这样可以大大的缩小静态库而又可以满足使用需要。而至于有哪些解码方式,可以使用
./configure --list-decoders来查看。./configure --help可以查看其他很多可执行命令。
Help options:
--help print this message
--list-decoders show all available decoders
--list-encoders show all available encoders
--list-hwaccels show all available hardware accelerators
--list-demuxers show all available demuxers
--list-muxers show all available muxers
--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</span>
至于该禁用那些,该启用哪些,从而达到最优的编译,额,这可能还需要对ffmpeg的各个组件以及它们在音视频处理过程中的作用比较了解了才行,能力有限,仍在探索中。
(4)--enable-cross-compile是允许交叉编译,--target-os=darwin是指定目标操作系统为苹果系统内核(darwin)。
(5)--sysroot=后面跟的是编译对应的iOS SDK的路径,ffmpeg真机和模拟器的编译是不同的,这里路径也相应的不同。这里的“
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk
”是模拟器的路径。(6)--cc=后面是编译器的路径,Xcode5之后默认编译改为clang了,使用gcc好像也可以。
(7)--arch=i386 --cpu=i386是选择系统的结构和cpu类型,模拟器都是i386,iphone3GS以上为:--arch=arm --cpu=cortex-a8,iphone5s为--arch=arm --cpu=cortex-a9。
(8)这里没写的,还有一个命令:--disable-static,使用了之后,编译出来的是动态库,不过苹果貌似不允许使用动态库,没去深究,有需要的朋友可以去研究下动态库的ffmpeg。
编译过程出问题,可以去ffmpeg的目录下查看config.log文件,打开可以查看关于错误的更详细信息。
3、使用:
编译成功后,会有两个文件夹:include和lib,一个头文件、一个库。把它们添加进项目里面,然后需要配置Header SearchPaths和Library Search Paths,也就是头文件和库的路径,否则会报错提示“xxx/xxx.h”文件未找到。然后配置好了,还是提示某些文件缺失,可能一是需要添加某些系统动态库或者框架,而是可能在编译的时候disable了某些组件。需要了解了项目的需求后,把相应的库编译进来。
参考文章:第一篇