iOS集成FFmpeg开发

一、选用FFmpeg编译脚本

集成FFmpeg初学者使用的脚本是FFmpeg-iOS-build-script,该脚本将自动下载FFmpeg源码并提供编译选项,但是需要第三方库编译的选项将很难编译成功。如需要文字水印的--enable-libfreetype和--enable-libfontconfig,需要另外下载第三方库freetype、fontconfig的源码和源码对应编译脚本。

因此,我这里推荐使用的脚本是mobile-ffmpeg,地址是

https://github.com/tanersener/mobile-ffmpeg

这脚本含有第三方库源码和编译脚本,为ffmpeg的编译提供极大便利。

二、FFmpeg编译准备工具

1.Xcode 8和Command Line Tools for Xcode8

苹果官网下载特定Xcode8版本地址:下载Xcode8

下载Xcode

左侧选择Developer Tools,右侧选择Xcode8和Command Line Tools下载并安装。

为什么这里需要使用Xcode8呢?

因为使用高版本Xcode编译出来的静态库支持的cpu架构是arm64和x86_64,其它cpu架构是不支持的.

所以我这里为了支持arm64、x86_64、i386和armv7这4种cpu架构,使用Xcode8编译。

当然,如果不需要多cpu架构的话可以使用最新的xcode版本进行编译

如果已有高版本Xcode怎么办?

如果已有高版本Xcode也可以下载Xcode8,并将编译组件切换到xcode8即可。

如我下载后安装在D盘,安装时将Xcode改名成Xcode8,以便区分。

输入以下命令即可切换:

sudo xcode-select -s /Volumes/D/Xcode8.app

2.下载安装gas-preprocessor

sudo git clone https://github.com/bigsen/gas-preprocessor.git /usr/local/bin/gas    

sudo cp /usr/local/bin/gas/gas-preprocessor.pl /usr/local/bin/gas-preprocessor.pl

sudo chmod u+x /usr/local/bin/gas-preprocessor.pl

sudo rm -rf /usr/local/bin/gas/

3.下载安装yams

curl http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz -o yasm-1.2.0.gz

tar -zxvf yasm-1.2.0.gz

cd yasm-1.2.0

./configure && make -j 4 && sudo make install

三、FFmpeg编译

下载mobile-ffmpeg完成后,执行ios.sh脚本

cd /Volumes/D/mobile-ffmpeg-master        // 切换到目标目录

./ios.sh --disable-arm64e                            // --diable-arm64e 不需要arm64e架构

编译成功显示ok

在当前目录下会产生prebuilt文件夹,文件夹内含有我所需要的ffmpeg静态库.a文件

生成目录

我们取ffmpeg静态库.a文件,位于文件夹prebuilt/ios-universal/ffmpeg-universal文件夹中

ios-arm64-apple-darwin和其它cpu架构合成之后就放到ios-universal文件夹下

到这里,我们已经成功编译出ffmpeg静态库了。

四、FFmpeg集成到Xcode项目中

FFmpeg使用方式有2种,直接使用静态库;使用fftools,通过ffmpeg命令行调用ffmpeg。

1.新建Xcode工程

新建项目ios_FFmpeg_Demo,拷贝以下2个目录中的文件到工程中:  

fftools

./mobile-ffmpeg-master/src/ffmpeg/fftools 文件夹中只保留ffmpeg.h/.c、cmdutils.h/.c、ffmpeg_opt.c、ffmpeg_filter.c、ffmpeg_hw.c,其余文件删除


ffmpeg_lib

./mobile-ffmpeg-master/prebuilt/ios-universal/ffmpeg-universal文件夹中删除LICENSE文件

2.设置搜索的头文件路径

$(PROJECT_DIR)/iOS_FFmpeg_Demo/ffmpeg-universal/include

设置头文件路径

3.增加链接库

Target-Build Phases-Link Binary With Libraries中加入以下库:


4.解决编译报错问题

1).编译报错

编译报错有一些头文件无法找到,我们直接将其屏蔽

#include "compat/va_copy.h"

#include "libavresample/avresample.h"

#include "libpostproc/postprocess.h"

PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);

PRINT_LIB_INFO(postproc, POSTPROC, flags, level);

2).另外一些编译报错如图所示:

Invalid instruction mnemonic 'movgt'

我们可以直接找到调用该函数的地方,将其屏蔽。搜索mid_pred调用的地方。

mid_pred屏蔽

3).函数名字重复


函数名重复

这里是指main函数在main和ffmpeg中重复了,故我们修改ffmpeg.c中的main函数,变成ffmpeg_main

修改主函数名

4).提供接口调用

在ffmpeg.h文件中定义在上一步修改的函数名ffmpeg_main,提供接口调用

定义接口

5).调用优化

问题1:ffmpeg.c的代码中会访问空属性导致程序崩溃

解决方法:在 ffmpeg.c 中 找到 ffmpeg_cleanup 方法,在 term_exit() 前,将各个计数器置零:

static void ffmpeg_cleanup(int ret)

{

........................

nb_filtergraphs=0;

nb_output_files=0;

nb_output_streams=0;  

nb_input_files=0;

nb_input_streams=0;

term_exit();

ffmpeg_exited = 1;

}

问题2:命令执行结束退出程序的问题

FFmpeg 默认执行完会执行 exit_program 方法结束进程,而iOS下只能启动一个进程,如果默认不做处理,执行完一条命令后app就自动退出了,所以需要做一个处理。

解决方案:命令执行完不进行结束线程和进程,只进行 cleanup。

在 ffmpeg.c 的 ffmpeg_main 函数中,把所有调用 exit_program 函数 ,改为调用 ffmpeg_cleanup 函数就可以了。

5).测试调用

在ViewController.m中包含ffmpeg.h文件,调用ffmpeg_main接口

调用ffmpeg_main接口

四、结束

本文demo:

以上步骤可接入ffmpeg库并输入命令行使用,但mobile-ffmpeg脚本是如何运行的,我在下一篇中将会简单分析。并且我会以文字水印为例讲述如何使用该脚本编译第三方库freetype、fontconfig,可看到该脚本的便利性

参考资料:https://juejin.im/entry/5c20fddd6fb9a049d37f1ed5

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容