FFmpeg編譯-iOS平臺(tái)

介紹

  • FFmpeg是一個(gè)多平臺(tái)多媒體處理工具尽棕,所以也可以在Mac下運(yùn)行,下面會(huì)分別列出在Mac下如何安裝FFmpeg以及如何編譯出iOS可用的庫(kù)彬伦。

  • 本次主要介紹兩種引入方式滔悉,第一種是通過(guò)腳本編譯,第二種是通過(guò)CocoaPods直接指定下載已經(jīng)編譯好的庫(kù)媚朦。

FFmpeg 官網(wǎng) : http://ffmpeg.org/download.html
FFmpeg 源碼 : https://github.com/FFmpeg/FFmpeg
FFmpeg doc : http://www.ffmpeg.org/documentation.html
FFmpeg wiki : https://trac.ffmpeg.org/wiki
Homebrew 安裝網(wǎng)站 : https://brew.sh/index_zh-cn.html
FFmpeg官方安裝教程 : https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX

一氧敢、腳本編譯

1. 編譯Mac下可用 FFmpeg

  • 編譯Mac下可用 FFmpeg,主要是可以在mac中询张,使用 FFmpeg 進(jìn)行操作視頻等孙乖。

Homebrew介紹

  • 簡(jiǎn)稱brew,是Mac OSX上的軟件包管理工具份氧,能在Mac中方便的安裝軟件或者卸載軟件唯袄。

Homebrew安裝

Homebrew命令使用

  • 搜索軟件:brew search 軟件名, 如brew search wget

  • 安裝軟件:brew install 軟件名蜗帜, 如brew install wget

  • 卸載軟件:brew remove 軟件名恋拷,如brew remove wget

通過(guò)Homebrew 安裝 FFmpeg

  • 終端執(zhí)行:執(zhí)行 brew install ffmpeg --with-libvpx --with-libvorbis --with-ffplay

  • 在終端中執(zhí)行一下命令,等待安裝完成即可:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 安裝好Homebrew厅缺,然后終端執(zhí)行 "brew install ffmpeg"蔬顾,等待完成即可。

  • 執(zhí)行結(jié)束湘捎,在終端中輸入ffmpeg诀豁,驗(yàn)證是否安裝成功。

2. 編譯 iOS 下 FFmpeg

  • 主要是用于iOS下可用的FFmpeg

手動(dòng)編譯FFmpeg網(wǎng)上有一些方法窥妇,但是稍顯復(fù)雜而陳舊, 所以現(xiàn)在大部分都是使用FFmpeg-iOS-build-script.sh這個(gè)腳本舷胜,比較方便直接

  • FFmpeg-iOS-build-script 是一個(gè)外國(guó)人寫的自動(dòng)編譯的腳本,腳本則會(huì)自動(dòng)從github中把ffmpeg源碼下到本地并開(kāi)始編譯出iOS可用的庫(kù)活翩,支持各種架構(gòu)烹骨。

在進(jìn)行編譯之前,需要做一些準(zhǔn)備工作安裝必備文件:

2.1 安裝 gas-preprocessor

  • 后面運(yùn)行 FFmpeg-iOS-build-script 這個(gè)自動(dòng)編譯腳本需要 gas-preprocessor .

  • 安裝步驟(依次執(zhí)行下面命令):

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 777 /usr/local/bin/gas-preprocessor.pl
sudo rm -rf /usr/local/bin/gas/

2.2 安裝 yams

  • yasm是匯編編譯器材泄,因?yàn)閒fmpeg中為了提高效率用到了匯編指令沮焕,所以編譯時(shí)需要安裝

  • 安裝步驟(依次執(zhí)行下面命令):

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 

2.3 配置 FFmpeg 編譯腳本

下載編譯腳本

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

配置FFmpeg版本,當(dāng)前使用的是4.3.1版本

根據(jù)需要編譯出需要的庫(kù)文件脸爱,修改配置 build-ffmpeg.sh 腳本里面 CONFIGURE_FLAGS 后面的內(nèi)容遇汞,可用把很多不需要的東西,都禁止掉簿废,這樣編譯出來(lái)的庫(kù)就不會(huì)非常龐大

配置選項(xiàng)參數(shù)

在ffmpeg源碼目錄下空入,終端執(zhí)行 ./configure --help可用查看全部參數(shù),下面簡(jiǎn)單列出部分參數(shù)

--disable-static :// 不構(gòu)建靜態(tài)庫(kù)[默認(rèn):關(guān)閉]
--enable-shared :// 構(gòu)建共享庫(kù)
--enable-gpl :  // 允許使用GPL代碼族檬。
--enable-nonfree :// 允許使用非免費(fèi)代碼歪赢。
--disable-doc :  // 不構(gòu)造文檔
--disable-avfilter  :// 禁止視頻過(guò)濾器支持
--enable-small  :   // 啟用優(yōu)化文件尺寸大小(犧牲速度)
--cross-compile  : // 使用交叉編譯
--disable-hwaccels  :// 禁用所有硬件加速(本機(jī)不存在硬件加速器单料,所有不需要)
--disable-network  ://  禁用網(wǎng)絡(luò)

--disable-ffmpeg  --disable-ffplay  --disable-ffprobe  --disable-ffserver
// 禁止ffmpeg埋凯、ffplay、ffprobe扫尖、ffserver 

--disable-avdevice --disable-avcodec --disable-avcore
// 禁止libavdevice白对、libavcodec、libavcore 

--list-decoders : // 顯示所有可用的解碼器
--list-encoders : // 顯示所有可用的編碼器
--list-hwaccels : // 顯示所有可用的硬件加速器            
--list-protocols : // 顯示所有可用的協(xié)議                                  
--list-indevs :   // 顯示所有可用的輸入設(shè)備
--list-outdevs : // 顯示所有可用的輸出設(shè)備
--list-filters :// 顯示所有可用的過(guò)濾器
--list-parsers :// 顯示所有的解析器
--list-bsfs :  // 顯示所有可用的數(shù)據(jù)過(guò)濾器   

--disable-encoder=NAME : // 禁用XX編碼器 | disables encoder NAME
--enable-encoder=NAME : // 用XX編碼器 | enables encoder NAME
--disable-decoders :   // 禁用所有解碼器 | disables all decoders

--disable-decoder=NAME : // 禁用XX解碼器 | disables decoder NAME
--enable-decoder=NAME : // 啟用XX解碼器 | enables decoder NAME
--disable-encoders :   // 禁用所有編碼器 | disables all encoders

--disable-muxer=NAME : // 禁用XX混音器 | disables muxer NAME
--enable-muxer=NAME : // 啟用XX混音器 | enables muxer NAME
--disable-muxers :   // 禁用所有混音器 | disables all muxers

--disable-demuxer=NAME : // 禁用XX解軌器 | disables demuxer NAME
--enable-demuxer=NAME : // 啟用XX解軌器 | enables demuxer NAME
--disable-demuxers :   // 禁用所有解軌器 | disables all demuxers

--enable-parser=NAME :  // 啟用XX剖析器 | enables parser NAME
--disable-parser=NAME : // 禁用XX剖析器 | disables parser NAME
--disable-parsers :    // 禁用所有剖析器 | disa

運(yùn)行腳本生成 FFmpeg:

配置好選項(xiàng)參數(shù)后就可以運(yùn)行腳本换怖,等待生成FFmpeg庫(kù)甩恼。

To build everything:
  ./build-ffmpeg.sh

To build arm64 libraries:
  ./build-ffmpeg.sh arm64

To build fat libraries for armv7 and x86_64 (64-bit simulator):
  ./build-ffmpeg.sh armv7 x86_64

To build fat libraries from separately built thin libraries:
  ./build-ffmpeg.sh lipo

根據(jù)不同CPU編譯出支持不同架構(gòu)的庫(kù),此處我們使用./build-ffmpeg.sh沉颂,編譯支持arm64 armv7 x86_64 i386架構(gòu)的庫(kù)

運(yùn)行完畢就會(huì)生成對(duì)應(yīng)版本的庫(kù)

2.4 iOS 下 集成 FFmpeg

將FFmpeg-iOS直接拖進(jìn)我們的項(xiàng)目即可条摸,勾選copy,設(shè)置 Header Search Paths 路徑铸屉,指向 項(xiàng)目中include目錄(如

"$(SRCROOT)/MultiCam/3rd/FFmpeg-iOS/include"

引用

 #import "avformat.h"

在代碼中 寫

av_register_all();

然后進(jìn)行編譯钉蒲,如果沒(méi)有報(bào)錯(cuò),代表編譯成功( av_register_all()已經(jīng)過(guò)時(shí)了彻坛,但是還可以驗(yàn)證是不是引用ffmpeg對(duì)了)顷啼。 到這一步已經(jīng)可以正常使用library庫(kù)了。

2.5 iOS 運(yùn)行 FFmpeg Tool

(1)到這一步其實(shí)已經(jīng)可以使用library庫(kù)了昌屉,如果要對(duì)音視頻進(jìn)行操作钙蒙,需要手動(dòng)寫C++代碼去調(diào)用 API 使用FFmpeg。

(2)如果想要使用Tool工具來(lái)調(diào)用 FFmpeg 的話怠益,就是直接通過(guò)調(diào)用傳參的方式執(zhí)行ffmpeg 命令的話仪搔,就需要:

  • 把剩下的 ffmpeg.h ffmpeg.c 等依賴的文件拖進(jìn)項(xiàng)目中,并導(dǎo)入ffmpeg.h 文件蜻牢。

  • 然后進(jìn)行調(diào)用 ffmpeg_main 函數(shù)傳遞參數(shù)烤咧,執(zhí)行 ffmpeg 命令即可。

二抢呆、MobileFFmpeg集成

這種方式是通過(guò)pod直接install別人已經(jīng)編譯好的庫(kù)

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

可以通過(guò)不同的需求煮嫌,指定下載不同版本的內(nèi)容進(jìn)行編譯下載

這邊當(dāng)前選擇的是full版本不帶gpl的,可以滿足字體抱虐、濾鏡等需求即可

pod 'mobile-ffmpeg-full'

pod install 即可下載

使用起來(lái)也很簡(jiǎn)單

#import <mobileffmpeg/MobileFFmpegConfig.h>
#import <mobileffmpeg/MobileFFmpeg.h>

int rc = [MobileFFmpeg execute: @"-i file1.mp4 -c:v mpeg4 file2.mp4"];

if (rc == RETURN_CODE_SUCCESS) {
    NSLog(@"Command execution completed successfully.\n");
} else if (rc == RETURN_CODE_CANCEL) {
    NSLog(@"Command execution cancelled by user.\n");
} else {
    NSLog(@"Command execution failed with rc=%d and output=%@.\n", rc, [MobileFFmpegConfig getLastCommandOutput]);
}

附:Cocoapods配置安裝流程

三昌阿、ffmpeg-kit集成編譯補(bǔ)充 2022-09-19

這種其實(shí)是在MobileFFmpeg的基礎(chǔ)上進(jìn)行改進(jìn)的,支持更多的平臺(tái)一鍵集成,關(guān)鍵是此庫(kù)是在mobile-ffmpeg基礎(chǔ)上進(jìn)行迭代的懦冰,支持ffmpeg 4.5灶轰,削減版的V5;

地址:https://github.com/tanersener/ffmpeg-kit

pod 'ffmpeg-kit-ios-full-gpl'

注:如果include失敗刷钢,library search paths 跟 header search paths 都需要添加 "$(SRCROOT)/Pods/ffmpeg-kit-ios-full-gpl"

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笋颤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子内地,更是在濱河造成了極大的恐慌伴澄,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阱缓,死亡現(xiàn)場(chǎng)離奇詭異非凌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荆针,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門敞嗡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人祭犯,你說(shuō)我怎么就攤上這事秸妥。” “怎么了沃粗?”我有些...
    開(kāi)封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵粥惧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我最盅,道長(zhǎng)突雪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任涡贱,我火速辦了婚禮咏删,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘问词。我一直安慰自己督函,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布激挪。 她就那樣靜靜地躺著辰狡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垄分。 梳的紋絲不亂的頭發(fā)上宛篇,一...
    開(kāi)封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音薄湿,去河邊找鬼叫倍。 笑死偷卧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吆倦。 我是一名探鬼主播听诸,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逼庞!你這毒婦竟也來(lái)了蛇更?” 一聲冷哼從身側(cè)響起瞻赶,我...
    開(kāi)封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赛糟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后砸逊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧南,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年师逸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了司倚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篓像,死狀恐怖动知,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情员辩,我是刑警寧澤盒粮,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站奠滑,受9級(jí)特大地震影響丹皱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宋税,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一摊崭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杰赛,春花似錦呢簸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瓶珊,卻和暖如春啸箫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伞芹。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工忘苛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝉娜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓扎唾,卻偏偏與公主長(zhǎng)得像召川,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胸遇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容