介紹
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安裝
- 打開(kāi)終端執(zhí)行 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”)"
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]);
}
三昌阿、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"