上篇记录了利用x264编码的实现,这里记录一下FFmpeg+x264编码为H.264的实现过程,为什么使用FFmpeg+x264,因为两种框架互补组成了强大的编解码器(FFmpeg解码,x246编码)。
编译FFmpeg+x264
FFmpeg
地址:https://github.com/FFmpeg/FFmpeg
编译脚本:https://github.com/kewlbear/FFmpeg-iOS-build-script
x264
地址:http://www.videolan.org/developers/x264.html
编译脚本:https://github.com/kewlbear/x264-ios
具体编译过程:x264的编译过程在上篇iOS音视频开发-视频软编码(x264编码H.264文件)
FFmpeg+x264编译步骤:
1、将编译好的x264文件夹放置在FFmpeg脚本目录下,并将文件夹改名为fat-x264(因为脚本中定义的引用x264文件夹的名称为fat-x264);
2、执行脚本文件:./build-ffmpeg.sh。
这里需要注意的问题,之前编译并没有遇到,此次总结重新编译了一次,遇到一些问题记录一下。
1)现阶段最新的FFmpeg版本为:n3.4.2,脚本中使用版本号为:n3.4。执行脚本的时候会出现诸如此类的错误:1
2
3libavcodec/libx264.c: In function 'x264_init_static':
libavcodec/libx264.c:892.9 error: 'x264_bit_depth' undeclared(first use in this function)
if(x264_bit_depth== 8)解决办法:修改脚本文件中的版本号:FF_VERSION=”3.4->FF_VERSION=”3.4.2”。
2)要将x264编译进FFmpeg中,需要取消脚本中对该句代码的注销:
1
#X264=`pwd`/fat-x264 ->X264=`pwd`/fat-x264
3)关于bitcode,现阶段在编译库文件的时候,支持bitcode还是有必要的(毕竟某个工程因为使用了此编译库文件放弃bitcode功能,向上层开发者提供了功能,是不使用是他们的事了),脚本中已经实现了支持bitcode功能,不必修改。
4)将编译好的文件拖拽到工程中,需要添加的依赖库为:
libiconv.dylib、
libz.dylib/libbz2.dylib、
CoreMedia.framework、
AVFoundation.framework、
VideoToolbox.framework,
不然会报并未支持arm64……架构的错误。
命令行命令:1
2
3
4//查看是否支持相应的架构:arm64 i386....
lipo -info libxx.a
//查看是够支持bitcode >=0
otool -l libx264.a | grep __bitcode | wc -l
介绍:不错的编译过程文章
视频捕获和编码配置代码在前面已记录,这里就不赘述了。FFmpeg+x264编码实现代码如下:
1 | #import <Foundation/Foundation.h> |
编码使用FFmpeg新版API实现,网上很多都是较旧的API代码,但不影响,只是个别接口变更而已,整体的实现思路一致。
学习过程中,查阅了大量的资料,收获颇丰,非常感谢学习路上各位coder的无私分享,尤其coderWhy先森、七牛的深爱、雷霄骅(致敬)。
参考链接:
https://depthlove.github.io/2015/09/18/use-ffmpeg-and-x264-encode-iOS-camera-video-to-h264/
http://blog.csdn.net/leixiaohua1020/article/details/25430425