[iOS] ffmpeg iOS 版本编译和 KxMovie 播放器编译
1、ffmpeg 编译:
ffmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。
1)环境和版本:
Xcode 6.4
ffmpeg v2.7.2
2)下载 ffmpeg(可选,如果没有预先下载编译脚本也会下载):
http://www.ffmpeg.org/download.html
或者从百度网盘下载:
http://pan.baidu.com/s/1qWCBwHu
3)下载编译脚本:
下载 gas-preprocessor:
https://github.com/yuvi/gas-preprocessor
下载 FFmpeg-iOS-build-script:
https://github.com/kewlbear/FFmpeg-iOS-build-script
或者从百度网盘下载:
http://pan.baidu.com/s/1qWQi47U
4)将编译脚本和源文件解压后放入同一目录,如下:
.\build-ffmpeg.sh
.\gas-preprocessor.pl
.\ffmpeg-2.7.2\
5)在命令行运行:
1 | sh build-ffmpeg.sh |
如果没有错误的话,这个脚本就会在 FFmpeg-iOS 目录下生成 include 和 lib 文件,这就是我们需要的 iOS 版本 ffmpeg 库,包含了 armv7、arm64、i386、x64_64 四个版本。也就是说真机和模拟器版本都有了。
当然,如果你只需要其中某个版本,也可以在 thin 目录下找到相应的库。
2、编译 kxmovie 播放器:
1)下载 kxmovie 源代码:
https://github.com/kolyvan/kxmovie
或者百度网盘:
http://pan.baidu.com/s/1eQ76dLg
2)打开 kxmovie 源码文件夹,在其根目录下添加 FFmpeg 目录并将刚才编译的 include 和 lib 目录拷入;
.\FFmpeg\include
.\FFmpeg\lib
3)打开 kxmovie.xcworkspace,在 kxmovie 静态库工程里面 Header Search Paths 增加 ffmpeg 路径:
$(SRCROOT)/FFmpeg/include
4)在 KxMovieExample 工程里面 Library Search Paths 增加 ffmpeg 路径:
$(SRCROOT)/FFmpeg/lib
5)在 KxMovieExample 工程里面 Link With Libraries 增加如下框架:
MediaPlayer, CoreAudio, AudioToolbox, Accelerate, QuartzCore, OpenGLES, AVFoundation
以及动态链接库:
libz.dylib,libiconv.dylib, libbz2.dylib
当然还有 ffmpeg 下的所有 lib。
6)编译运行 KxMovieExample。
常见问题 Q&A:
1、无法链接 bz 库:
出现如下问题时:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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) |
请检查 2 中步骤 5)是否添加了 libbz2.dylib。
2、无法链接 AVCapture 库:
出现如下问题时:
1 2 3 4 5 6 7 8 9 10 11 12 13 | Undefined symbols for architecture arm64: "OBJC_CLASS$AVCaptureVideoDataOutput", referenced from: objc-class-ref in libavdevice.a(avfoundation.o) "_OBJC_CLASS$AVCaptureAudioDataOutput", referenced from: objc-class-ref in libavdevice.a(avfoundation.o) "_OBJC_CLASS$AVCaptureDeviceInput", referenced from: objc-class-ref in libavdevice.a(avfoundation.o) "_OBJC_CLASS$AVCaptureSession", referenced from: objc-class-ref in libavdevice.a(avfoundation.o) "_OBJC_CLASS$_AVCaptureDevice", referenced from: objc-class-ref in libavdevice.a(avfoundation.o) ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation) |
请检查 2 中步骤 5)是否添加了 AVFoundation.framework。
附录:
1、完整 iOS 版本 ffmpeg 库下载:
http://pan.baidu.com/s/1gdEVFc3
参考文献:
1、http://blog.sina.com.cn/s/blog_4462d1710101k4ld.html
2、https://github.com/kewlbear/FFmpeg-iOS-build-script/issues/2
3、https://github.com/kewlbear/FFmpeg-iOS-build-script/issues/24