iOS手動(dòng)編譯并搭建FFmpeg

需求

手動(dòng)編譯打開(kāi)x264功能的FFmpeg并放入新建的項(xiàng)目中,可以編譯成功.以便后續(xù)使用.

背景

移動(dòng)端學(xué)習(xí)音視頻開(kāi)發(fā),FFmpeg可以說(shuō)是必學(xué)的框架,FFmpeg在linux平臺(tái)下開(kāi)發(fā),但它同樣也可以在其他操作系統(tǒng)環(huán)境中編譯運(yùn)行厚掷,包括Windows组民、Mac OS X等。FFmpeg是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻乓梨、視頻瞄桨,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序,它包括了目前領(lǐng)先的音/視頻編碼庫(kù)libavcodec洒宝。

FFmpeg有非常強(qiáng)大的功能购公,包括視頻采集功能、視頻格式轉(zhuǎn)換雁歌、視頻抓圖宏浩、給視頻加水印等。同時(shí)還支持以RTP方式將視頻流傳送給支持RTSP的流媒體服務(wù)器靠瞎,支持直播應(yīng)用比庄。

安裝方式

可以通過(guò)如下兩種方式安裝ffmpeg

  • 1.下載iOS版本ffmpeg靜態(tài)庫(kù): 即不用手動(dòng)編譯,我們只需要下載得到頭文件及.a庫(kù)文件.
  • 2.手動(dòng)編譯: 下載源碼, 可以在更改一些flag或源碼后再編譯腳本,較為靈活.

如何選擇

  • 如果僅僅是想簡(jiǎn)單直接使用ffmeg可以下載一個(gè)穩(wěn)定版本的靜態(tài)庫(kù), 建議用第一種方式.
  • 如果需要在iOS項(xiàng)目中自定義使用ffmpeg, 以及修改一些ffmpeg中的源碼以適應(yīng)項(xiàng)目,使用第二種方式.

閱讀前提:

  • 音視頻基礎(chǔ)
  • 基本終端命令行
  • FFmpeg基礎(chǔ)

注意: 文本僅僅編譯真機(jī)使用的arm64環(huán)境,所以模擬器下無(wú)法運(yùn)行項(xiàng)目,如需添加其他架構(gòu)自行更改兩個(gè)腳本文件.

本文需要的所有安裝包均在以下鏈接中,因?yàn)橄挛闹泄倬W(wǎng)地址是外網(wǎng),沒(méi)有VPN的同學(xué)可能下載會(huì)很慢.故本人整理好最新所有版本放在下面的百度云盤(pán)中.

鏈接: https://pan.baidu.com/s/1nYBQUi8drEpkjmwlIpbetQ 提取碼: ercw 

1.下載gas-preprocessor

此文件是編譯FFmpeg必備的腳本文件,使用如下命令將其拷貝進(jìn)bin下

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

2.安裝yasm

Yasm是一個(gè)完全重寫(xiě)的NASM匯編并且支持x86和AMD64指令集.

brew install yasm

3. 下載x264-iOS編譯腳本源碼

  • 下載x264編譯腳本解壓后如下


    1
  • 然后下載最新版源碼解壓后如下


    2
  • 將源碼文件夾改名為x264并放至編譯腳本文件夾(x264-ios-master)下

    3

因?yàn)榫幾g腳本中指定文件目錄為x264,所以需要改名,也可以改編譯腳本
最好手動(dòng)強(qiáng)制設(shè)置下GCC位置,否則可能會(huì)報(bào)錯(cuò),然后執(zhí)行命令:

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

No working C compiler found : 新版mac直接編譯會(huì)報(bào)錯(cuò),原因是gcc一些必要工具找不到.可能是xcode位置換了的原因,因?yàn)槲覀冎饕褂谜鏅C(jī)調(diào)試,所以我們?cè)诰幾g腳本中只保留arm64即可,如下修改后,可以直接編譯通過(guò). 不過(guò)像模擬器這樣的設(shè)置是無(wú)法使用x264的,因?yàn)槲覀兿喈?dāng)于僅編譯了真機(jī)所需的庫(kù).

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

執(zhí)行完成之后可以看到生成了x264-iOS文件夾

4. 下載FFmpeg-iOS編譯腳本源碼

注意: 在這里可以?xún)H下載FFmpeg-iOS編譯腳本,不用下載源碼,執(zhí)行腳本會(huì)自動(dòng)下載源碼,如果不想每次自動(dòng)下載,可以手動(dòng)下載源碼,稍微修改下FFmpeg編譯腳本即可.這里不做過(guò)多說(shuō)明.

修改腳本(build-ffmpeg.sh文件)內(nèi)容

4

x264編譯好的文件夾必須在當(dāng)前目錄并且命名為fat-x264,所以我們第3步編譯后生成的x264-iOS文件夾改名成fat-264,放在FFmpeg-iOS-build-script這個(gè)文件夾中乏盐。目錄結(jié)構(gòu)如下:


5.

并修改如下內(nèi)容

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

因?yàn)槲覀冊(cè)谏弦徊街袃H僅編譯arm64的x264,所以這里我們也僅僅編譯arm64的FFmpeg.稍微修改腳本文件即可.

ARCHS="arm64 armv7 x86_64 i386"
修改為
ARCHS="arm64"
  • 如果要使用avutil.h相關(guān)功能,需要更改腳本

注意: FFmpeg框架中的一個(gè)結(jié)構(gòu)體命名為"AVMediaType"與蘋(píng)果自帶框架產(chǎn)生沖突,所以,我們必須修改編譯腳本,使用"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項(xiàng)目

新建一個(gè)iOS工程,然后將ViewController.m重命名為ViewController.mm,因?yàn)镕Fmpeg中涉及C,C++混編,所以需要做此操作.

  • 將FFmpeg編譯好的頭文件與庫(kù)拉進(jìn)項(xiàng)目中,并在主控制器測(cè)試代碼,此時(shí)會(huì)有一大堆錯(cuò)誤拋出,下面逐個(gè)解決
3
  • 添加依賴(lài)庫(kù)

注意: FFmpeg源碼中調(diào)用了一些iOS系統(tǒng)的庫(kù),所以,我們必須將依賴(lài)的庫(kù)導(dǎo)入項(xiàng)目中.

4
  • 在Build Setting中禁止Bitcode
2
  • 在Build Setting中設(shè)置頭文件與庫(kù)的位置

這里特別要注意,因?yàn)樵诖蠖鄶?shù)項(xiàng)目中以及FFmpeg自身源代碼中,都是以以下格式來(lái)導(dǎo)入的頭文件

1.

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末佳窑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子父能,更是在濱河造成了極大的恐慌神凑,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何吝,死亡現(xiàn)場(chǎng)離奇詭異溉委,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)岔霸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)薛躬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人呆细,你說(shuō)我怎么就攤上這事型宝。” “怎么了絮爷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵趴酣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我坑夯,道長(zhǎng)岖寞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任柜蜈,我火速辦了婚禮仗谆,結(jié)果婚禮上指巡,老公的妹妹穿的比我還像新娘。我一直安慰自己隶垮,他們只是感情好藻雪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著狸吞,像睡著了一般勉耀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹋偏,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天便斥,我揣著相機(jī)與錄音,去河邊找鬼威始。 笑死枢纠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的字逗。 我是一名探鬼主播京郑,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼葫掉!你這毒婦竟也來(lái)了些举?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俭厚,失蹤者是張志新(化名)和其女友劉穎户魏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挪挤,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叼丑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扛门。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸠信。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖论寨,靈堂內(nèi)的尸體忽然破棺而出星立,到底是詐尸還是另有隱情,我是刑警寧澤葬凳,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布绰垂,位于F島的核電站,受9級(jí)特大地震影響火焰,放射性物質(zhì)發(fā)生泄漏劲装。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望占业。 院中可真熱鬧绒怨,春花似錦、人聲如沸纺酸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)餐蔬。三九已至,卻和暖如春佑附,著一層夾襖步出監(jiān)牢的瞬間樊诺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工音同, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留词爬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓权均,卻偏偏與公主長(zhǎng)得像顿膨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叽赊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 本文介紹iOS下使用FFmpeg+x264進(jìn)行軟編碼恋沃。x264是一個(gè)開(kāi)源的H.264/MPEG-4 AVC視頻編碼...
    Goning閱讀 4,259評(píng)論 4 9
  • 前言: 在音視頻開(kāi)發(fā)的過(guò)程中,了解交叉編譯是必須的,因?yàn)樵陂_(kāi)發(fā)過(guò)程中,用到的很多第三方庫(kù)都需要進(jìn)行交叉編譯的,然后...
    CoderP1閱讀 2,700評(píng)論 10 13
  • 46. 全排列給定一個(gè)沒(méi)有重復(fù)數(shù)字的序列,返回其所有可能的全排列必指。示例:輸入: [1,2,3]輸出:[[1,2,3...
    杏仁小核桃閱讀 3,122評(píng)論 0 0
  • 主要計(jì)算公式: 直線的一般方程 y = kx + b; 圓的一般方程 x^2 + y^2 + Dx + ...
    闌丶夜閱讀 2,782評(píng)論 1 0
  • 我在一個(gè)不知名的小國(guó)打黑工囊咏,不料被發(fā)現(xiàn)了。國(guó)王將我關(guān)進(jìn)了地底監(jiān)獄塔橡,等待著我的不是遣返而是死亡梅割。 正當(dāng)我倚窗聽(tīng)風(fēng),安...
    秦菱可人閱讀 225評(píng)論 0 2