需求
手動(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編譯腳本解壓后如下
-
然后下載最新版源碼解壓后如下
-
將源碼文件夾改名為
x264
并放至編譯腳本文件夾(x264-ios-master
)下
因?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)容
x264編譯好的文件夾必須在當(dāng)前目錄并且命名為fat-x264,所以我們第3步編譯后生成的x264-iOS文件夾改名成fat-264,放在FFmpeg-iOS-build-script這個(gè)文件夾中乏盐。目錄結(jié)構(gòu)如下:
并修改如下內(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è)解決
- 添加依賴(lài)庫(kù)
注意: FFmpeg源碼中調(diào)用了一些iOS系統(tǒng)的庫(kù),所以,我們必須將依賴(lài)的庫(kù)導(dǎo)入項(xiàng)目中.
- 在Build Setting中禁止Bitcode
- 在Build Setting中設(shè)置頭文件與庫(kù)的位置
這里特別要注意,因?yàn)樵诖蠖鄶?shù)項(xiàng)目中以及FFmpeg自身源代碼中,都是以以下格式來(lái)導(dǎo)入的頭文件