前言
学习FFmpeg
环境
macOS Sierra 10.12.3
Xcode 8.2.1
FFmpeg 3.2
是什么?
一个用于录制,转换和流式传输音频和视频的完整的跨平台解决方案。
可通过git方式下载源码
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
流程
网上搜索了一下,关于FFmpeg的编译主要有两种
方案一
通过FFmpeg-iOS-build-script,来输出arm*架构下的.a*文件,比较旧的用iFrameExtractor,原理类似。
方案二
根据这篇用xcode调试FFmpeg的方法,但是这样只能在Mac上运行和调试,如果用file指令会知道发现可执行文件的架构是x86_64的。
我的尝试
有没有办法在Xcode的iOS项目中直接编译FFmpeg工程?
先说结果,目前没有做成功
阅读FFmpeg-iOS-build-script的build-ffmpeg.sh脚本
脚本前面下载源码及依赖脚本的部分,就不说了
最后的configure指令形式大概是这样的
1 | ./configure --target-os=darwin --arch=arm64 --cc="xcrun -sdk iphoneos clang" --enable-cross-compile --disable-debug --disable-programs --disable-doc --enable-pic --extra-cflags="-arch arm64 -mios-version-min=6.0 -fembed-bitcode" --extra-ldflags="-arch arm64 -mios-version-min=6.0 -fembed-bitcode" --prefix=/Users/Jason/Desktop/thin |
指定了架构,编译器类型,最低版本等信息,make*编译,.o*文件也可以正常产生。
1 | find ./* -name "*.o" |
通过查看编译了哪些.o,尝试找出源码中的哪些.c*是参与编译的。主要是几个库中的.c*文件参与了编译。
Xcode编译指令
用Xcode编译流程可通过下图方式获知
编译一个ViewController.m的指令
主要思路是把生成.a静态库的源文件,拷贝到工程中,然后编译的时候都用clang,只要保证编译的参数一致,应该是能过的。
最后说说卡在哪儿了吧,遇到*<OpenCL/cl.h>头文件没有找到,Xcode中找不到,用find指令在Xcode的mac SDK上倒是有查找,我现在不太清楚是不是因为这个原因导致,网上找到的结果都是编译成.a形式的,然后能调试的都是在mac*平台下的,如果有懂的,请告诉我。
我的解决方案
对于目前来说,是出于学习的目的,所以打算整3个Xcode工程
- 编译FFmpeg的静态库工程,FFmpeg-iOS-build-script
- 引用了静态库的iOS应用的工程,偏应用方面的,比如怎么使用FFmpeg的API来实现音视频编码解码之类的
- FFmpeg源码可调式命令行工程,用于调试研究FFmpeg的底层实现
编译静态库工程
1 |
|
引用静态库工程
使用引用方式将编译后的FFmpeg-iOS目录(包含静态库和头文件)添加到工程中
根据当前目录结构给Build Settings中的Library Search Paths,添加
1 | $(PROJECT_DIR)/../FFmpeg-iOS-build-script/FFmpeg-iOS/lib |
指向静态库的路径
引用依赖的动态库
- libz.dylib
- libbz2.dylib
- libiconv.dylib
添加kxmovie工程,一个基于FFmpeg的播放器
git下工程,并将kxmovie目录拖拽并复制到工程中,因为目录中有pch文件,
简单在Main.storyboard中添加一个导航控制器,并在工程的根控制器添加如下代码
1 | #import "KxMovieViewController.h" |
在Build settings的Prefix Header,添加如下字段,指向pch文件
1 | Learn-FFmpeg/kxmovie/kxmovie-Prefix.pch |
⌘ + B 提示
头文件路径的问题,同样在Build Settings的Header Search Paths添加
1 | $(PROJECT_DIR)/../FFmpeg-iOS-build-script/FFmpeg-iOS/include |
⌘ + B 提示
上面两个直接根据提示修改,下面那个,根据iOS编译FFmpeg、kxmovie实现视频播放将其注释
⌘ + B 提示
添加VideoToolbox.framework即可
⌘ + B 成功
修改代码,设置path为本地音频地址
1 | ViewController *vc; |
顺便设置info.plist以支持http访问
1 | <key>NSAppTransportSecurity</key> |
截图
视频截图
源码工程
参考用xcode调试FFmpeg的方法链接即可,在一些小地方注意一下即可,比如第一步生成ffmpeg_g*可执行文件–disable-optimizations && make -j3,取消优化,不然调试的时候很多变量值无法输出,-j参数是job*是编译的线程数的意思
设置断点,调试FFmpeg
最终目录结构
最终工程结构
Update 170309
因为FFmpeg-iOS-build-script没有添加到git中管理,整个目录文件,将近1个G,太大了,没有提交,简单写了个脚本来处理
1 | #!/bin/sh |