iOS手动编译并搭建FFmpeg

需求

手动编译打开x264功能的FFmpeg并放入新建的项目中,可以编译成功.以便后续使用.

背景

移动端学习音视频开发,FFmpeg可以说是必学的框架,FFmpeg在linux平台下开发,但它同样也可以在其他操作系统环境中编译运行,包括Windows、Mac OS X等。FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,它包括了目前领先的音/视频编码库libavcodec。

FFmpeg有非常强大的功能,包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。

安装方式

可以通过如下两种方式安装ffmpeg

  • 1.下载iOS版本ffmpeg静态库: 即不用手动编译,我们只需要下载得到头文件及.a库文件.
  • 2.手动编译: 下载源码, 可以在更改一些flag或源码后再编译脚本,较为灵活.

如何选择

  • 如果仅仅是想简单直接使用ffmeg可以下载一个稳定版本的静态库, 建议用第一种方式.
  • 如果需要在iOS项目中自定义使用ffmpeg, 以及修改一些ffmpeg中的源码以适应项目,使用第二种方式.

阅读前提:

  • 音视频基础
  • 基本终端命令行
  • FFmpeg基础

注意: 文本仅仅编译真机使用的arm64环境,所以模拟器下无法运行项目,如需添加其他架构自行更改两个脚本文件.

本文需要的所有安装包均在以下链接中,因为下文中官网地址是外网,没有VPN的同学可能下载会很慢.故本人整理好最新所有版本放在下面的百度云盘中.

链接: https://pan.baidu.com/s/1nYBQUi8drEpkjmwlIpbetQ 提取码: ercw 

1.下载gas-preprocessor

此文件是编译FFmpeg必备的脚本文件,使用如下命令将其拷贝进bin下

cp -f /xxx/gas-preprocessor.pl /usr/local/bin/

2.安装yasm

Yasm是一个完全重写的NASM汇编并且支持x86和AMD64指令集.

brew install yasm

3. 下载x264-iOS编译脚本源码

  • 下载x264编译脚本解压后如下


    1
  • 然后下载最新版源码解压后如下


    2
  • 将源码文件夹改名为x264并放至编译脚本文件夹(x264-ios-master)下

    3

因为编译脚本中指定文件目录为x264,所以需要改名,也可以改编译脚本
最好手动强制设置下GCC位置,否则可能会报错,然后执行命令:

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
./build-x264.sh
  • 注意

No working C compiler found : 新版mac直接编译会报错,原因是gcc一些必要工具找不到.可能是xcode位置换了的原因,因为我们主要使用真机调试,所以我们在编译脚本中只保留arm64即可,如下修改后,可以直接编译通过. 不过像模拟器这样的设置是无法使用x264的,因为我们相当于仅编译了真机所需的库.

ARCHS="arm64 x86_64 i386 armv7 armv7s"
改为如下
ARCHS="arm64"

执行完成之后可以看到生成了x264-iOS文件夹

4. 下载FFmpeg-iOS编译脚本源码

注意: 在这里可以仅下载FFmpeg-iOS编译脚本,不用下载源码,执行脚本会自动下载源码,如果不想每次自动下载,可以手动下载源码,稍微修改下FFmpeg编译脚本即可.这里不做过多说明.

修改脚本(build-ffmpeg.sh文件)内容

4

x264编译好的文件夹必须在当前目录并且命名为fat-x264,所以我们第3步编译后生成的x264-iOS文件夹改名成fat-264,放在FFmpeg-iOS-build-script这个文件夹中。目录结构如下:


5.

并修改如下内容

CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET -fembed-bitcode"
修改为
CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET"

因为我们在上一步中仅仅编译arm64的x264,所以这里我们也仅仅编译arm64的FFmpeg.稍微修改脚本文件即可.

ARCHS="arm64 armv7 x86_64 i386"
修改为
ARCHS="arm64"
  • 如果要使用avutil.h相关功能,需要更改脚本

注意: FFmpeg框架中的一个结构体命名为"AVMediaType"与苹果自带框架产生冲突,所以,我们必须修改编译脚本,使用"FFmpegAVMediaType"带替换"AVMediaType".这里需要在脚本文件中添加如下命令行,即将AVMediaType替换为FFmpegAVMediaType. 注意: $SOURCE为ffmpeg的根目录.

grep -rl AVMediaType ./$SOURCE | xargs sed -i .bak s@AVMediaType@FFmpegAVMediaType@g

编译脚本文件

./build-ffmpeg.sh 

5. Xcode编译

  • Xcode新建iOS项目

新建一个iOS工程,然后将ViewController.m重命名为ViewController.mm,因为FFmpeg中涉及C,C++混编,所以需要做此操作.

  • 将FFmpeg编译好的头文件与库拉进项目中,并在主控制器测试代码,此时会有一大堆错误抛出,下面逐个解决
3
  • 添加依赖库

注意: FFmpeg源码中调用了一些iOS系统的库,所以,我们必须将依赖的库导入项目中.

4
  • 在Build Setting中禁止Bitcode
2
  • 在Build Setting中设置头文件与库的位置

这里特别要注意,因为在大多数项目中以及FFmpeg自身源代码中,都是以以下格式来导入的头文件

1.

参考文章

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

推荐阅读更多精彩内容

  • 本文介绍iOS下使用FFmpeg+x264进行软编码。x264是一个开源的H.264/MPEG-4 AVC视频编码...
    Goning阅读 4,065评论 4 8
  • 前言: 在音视频开发的过程中,了解交叉编译是必须的,因为在开发过程中,用到的很多第三方库都需要进行交叉编译的,然后...
    CoderP1阅读 2,581评论 10 13
  • 46. 全排列给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3...
    杏仁小核桃阅读 3,102评论 0 0
  • 主要计算公式: 直线的一般方程 y = kx + b; 圆的一般方程 x^2 + y^2 + Dx + ...
    阑丶夜阅读 2,704评论 1 0
  • 我在一个不知名的小国打黑工,不料被发现了。国王将我关进了地底监狱,等待着我的不是遣返而是死亡。 正当我倚窗听风,安...
    秦菱可人阅读 208评论 0 2