FFmpeg学习笔记01(环境搭建)

前言

  学习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的。

我的尝试

有没有办法在XcodeiOS项目中直接编译FFmpeg工程?

先说结果,目前没有做成功

阅读FFmpeg-iOS-build-scriptbuild-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应用的工程,偏应用方面的,比如怎么使用FFmpegAPI来实现音视频编码解码之类的
  • FFmpeg源码可调式命令行工程,用于调试研究FFmpeg的底层实现

编译静态库工程

1
2
3
4
5
6
7
8

git clone https://github.com/kewlbear/FFmpeg-iOS-build-script

# 编译
./build-ffmpeg.sh

# 合并
./build-ffmpeg.sh lipo

引用静态库工程

使用引用方式将编译后的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
2
3
4
5
6
7
8
9
#import "KxMovieViewController.h"
...
- (void)viewDidLoad {
[super viewDidLoad];
ViewController *vc;
NSString *path = @"";
vc = [KxMovieViewController movieViewControllerWithContentPath:path parameters:nil];
[self presentViewController:vc animated:YES completion:nil];
}

Build settingsPrefix Header,添加如下字段,指向pch文件

1
Learn-FFmpeg/kxmovie/kxmovie-Prefix.pch

⌘ + B 提示

头文件路径的问题,同样在Build SettingsHeader Search Paths添加

1
$(PROJECT_DIR)/../FFmpeg-iOS-build-script/FFmpeg-iOS/include

⌘ + B 提示

上面两个直接根据提示修改,下面那个,根据iOS编译FFmpeg、kxmovie实现视频播放将其注释

⌘ + B 提示

添加VideoToolbox.framework即可

⌘ + B 成功

修改代码,设置path为本地音频地址

1
2
3
4
ViewController *vc;
NSString *path = @"http://192.168.5.101/~Jason/TestMusic.mp3";
vc = [KxMovieViewController movieViewControllerWithContentPath:path parameters:nil];
[self presentViewController:vc animated:YES completion:nil];

顺便设置info.plist以支持http访问

1
2
3
4
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>

截图
IMG_0966

视频截图

IMG_0967

源码工程

参考用xcode调试FFmpeg的方法链接即可,在一些小地方注意一下即可,比如第一步生成ffmpeg_g*可执行文件–disable-optimizations && make -j3,取消优化,不然调试的时候很多变量值无法输出,-j参数是job*是编译的线程数的意思

设置断点,调试FFmpeg

最终目录结构

最终工程结构

DEMO

Update 170309

因为FFmpeg-iOS-build-script没有添加到git中管理,整个目录文件,将近1个G,太大了,没有提交,简单写了个脚本来处理

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh

version=3.2

if [ ! -d "./FFmpeg-iOS-build-script" ]; then
git clone https://github.com/kewlbear/FFmpeg-iOS-build-script
cd ./FFmpeg-iOS-build-script
./build-ffmpeg.sh
./build-ffmpeg.sh lipo
cd ffmpeg-${version}
./configure --disable-optimizations && make -j3
fi

参考

iOS摇一摇 理解Block(上)
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×