FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。同时,FFmpeg是一套跨平台的方案,所以我们可以在iOS开发中使用它来进行一些视频与GIF的开发。
接下来,我们从编译FFmpeg开始,到使用FFmpeg,再到使用中的一些注意事项进行总结。
一、编译FFMpeg
在这个过程中,我们需要以下几个资源:
2.yasm
1.gas-preprocessor
gas-preprocessor 其实就是我们要编译FFmpeg所需的脚本文件。
1).下载并解压
2).将 gas-preprocessor.pl 文件复制到 /usr/sbin/ 目录下,如果该目录无法修改,那么可将文件复制到 /usr/local/bin/ 目录下。
3).为 gas-preprocessor.pl 文件开启可执行权限,在终端中进行如下命令:
chmod 777 /usr/sbin/gas-preprocessor.pl
或
chmod 777 /usr/local/bin/gas-preprocessor.pl
2.yasm
yasm 是一个完全重写的 NASM 汇编。目前,它支持 x86 和 AMD64 指令集,接受 NASM 和气体汇编语法,产出二进制,ELF32,ELF64,COFF,Mach-O 的(32和64),RDOFF2的 Win32 和 Win64 对象的格式,并生成 STABS 调试信息的来源,DWARF 2 ,CodeView 8格式。
可以使用homebrew来安装:
brew install yasm
3.FFMpeg-iOS-build-script
在这个文件中,我们可以对要进行编译的FFmpeg进行一系列的设置。
1).设置FFmpeg的版本
FF_VERSION="3.3.6"
2).设置所要支持的架构
ARCHS="arm64 armv7"
3).设置所需要的FFmpeg功能配置
该设置可在 CONFIGURE_FLAGS= 中进行,通过禁用一些不必要的功能,可以有效地减小最终库文件的大小,格式如下:
禁用交叉编译:
--disable-cross-compile
支持交叉编译:
--enable-cross-compile
4).确保该脚本所在路径中不包含有空格
5).需要为该脚本所在文件夹赋予权限
chmod 777 /Users/mdm/Desktop/ffmpeg
6).进入脚本所在文件夹目录,执行脚本
./build-ffmpeg.sh
此过程可能会出现各种问题,大多数问题可以通过前往执行脚本过程中生成的 scratch 文件夹下的 config.log 中查看对应原因。
另外,如果遇到
xcrun -sdk iphoneos clang is unable to create an executable file.
C compiler test failed.
这是由于系统安装了多个Xcode环境所致,可使用下面方法选定一个Xcode环境来解决问题:
sudo xcode-select -s /Application/Xcode.app
7).脚本执行完毕,生成所需文件
ffmpeg-3.3.6 FFmpeg源文件
scratch 编译过程中生成的文件
thin 对应各个架构下的库文件
FFmpeg-iOS 合并各个架构之后的库文件
二.集成FFmpeg到项目中
1.将生成的FFmpeg-iOS文件夹拷贝至项目中。
2.添加所需依赖的依赖库,如下:
AudioToolbox.framework
CoreMedia.framework
VideoToolbox.framework
libz.tbd
libbz2.tbd
libiconv.tbd
3.添加 Header Search Paths 设置
$(SRCROOT)/项目名/所在文件夹/FFmpeg-iOS/include
三.集成FFmpeg命令行功能
我们在使用ffmpeg时,可以直接使用该功能,通过设置命令参数,从而避免编写大量c语言代码来调用ffmpeg库。
1.找到如下文件放入同一个文件夹下,并拷贝至工程目录中:
1).从 ffmpeg-3.3.6 中找到以下文件:
ffmpeg.h
ffmpeg.c
cmdutils.h
cmdutils.c
ffmpeg_filter.c
ffmpeg_opt.c
cmdutils_common_opts.h
2).从 scratch 文件夹下随便一个架构文件夹中找到如下文件:
config.h
2.修改文件
1).前往 cmdutils.c 文件中,注释以下内容: