文| iOS開發(fā)by文明 編譯任意版本FFmpeg
FFmpeg功能強(qiáng)大音視頻處理框架,特點(diǎn):開源、跨平臺(tái),底層用c語(yǔ)言實(shí)現(xiàn),幾乎沒(méi)有什么視頻格式是他不能播放的。
大公司做音視頻開發(fā)的人員幾乎都會(huì)用到它,它的主要作用是編解碼,至于顯示要用到SDL,iOS端顯示視頻幀是用openGLES,這方面的資料一般都比較陳舊,而且資料比較少,門檻高,導(dǎo)致人才斷層。FFmpeg官網(wǎng):http://ffmpeg.org/download.html。
本篇文章的目的是教會(huì)大家編譯任意版本的FFmpeg,跳過(guò)作者遇到的坑,節(jié)省時(shí)間,提高研究FFmpeg的積極性。網(wǎng)上的編譯教程太多了,簡(jiǎn)書、CSDN、github,看的我眼花繚亂,看教程也是很蛋疼,有些作者寫的不清楚,導(dǎo)致大家普遍編譯出錯(cuò),我就是被坑的一位。
研究FFmpeg少不了要去編譯,熟悉FFmpeg的人應(yīng)該知道,github有人開源出過(guò)編譯FFmpeg的腳本,https://github.com/kewlbear/FFmpeg-iOS-build-script。FFmpeg-iOS-build-script這個(gè)腳本,可以直接轉(zhuǎn)為iOS編譯可用的FFmpeg庫(kù),我們不用下載FFmpeg,腳本會(huì)幫我們下載指定版本的FFmpeg,并且打包成一個(gè)iOS可用的FFmpeg庫(kù)。我們有兩種方式得到編譯后的.a和文件,一種是直接去下載別人的demo或者是下載百度云盤里面的copy進(jìn)你項(xiàng)目使用;另一種是自己編譯。當(dāng)然是自己動(dòng)手豐衣足食更好了,想編譯什么版本都可以,目前大部分人使用的還都是老版本的FFmpeg,記得我群里的大蔥同學(xué)使用的是2.8版本,ijkPlayer用的是3.4版本的,kxmovie用的也是3.x版本的,(順便提一句kxmoive年久失修,4年沒(méi)有更新了,如果我們用FFmpeg的最新版本導(dǎo)入到kxmoive是不兼容的了,有些方法已經(jīng)廢棄,有些流程已經(jīng)改變)而FFmpeg官網(wǎng)已經(jīng)推出最新版本4.0.1。下載后的腳本文件默認(rèn)下載的FFmpeg的版本是FF_VERSION="3.4.2",打開build-ffmpeg.sh腳本文件,搜索FF_VERSION即可定位到。
編譯前的其他步驟我就不一一詳細(xì)解說(shuō)了,什么下載gas-preprocessor.pl,下載homebrew,下載yasm,這些步驟可以自行百度其他的文章,不是本文章重點(diǎn)介紹的內(nèi)容,其實(shí)上面的腳本文件里面也是有下載homebrew和yasm的邏輯的,
> if [ "$COMPILE" ]
>
> then
>
> if [ ! `which yasm` ]
>
> then
>
> echo 'Yasm not found'
>
> if [ ! `which brew` ]
>
> then
>
> echo 'Homebrew not found. Trying to install...'
>
> ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" \
>
> || exit 1
>
> fi
>
> echo 'Trying to install Yasm...'
>
> brew install yasm || exit 1
>
> fi
>
> if [ ! `which gas-preprocessor.pl` ]
>
> then
>
> echo 'gas-preprocessor.pl not found. Trying to install...'
>
> (curl -L https://github.com/libav/gas-preprocessor/raw/master/gas-preprocessor.pl \
>
> -o /usr/local/bin/gas-preprocessor.pl \
>
> && chmod +x /usr/local/bin/gas-preprocessor.pl) \
>
> || exit 1
>
> fi
仔細(xì)閱讀可以看出,里面判斷了如果沒(méi)有homebrew就去下載,如果沒(méi)有yasm就去下載,如果沒(méi)有g(shù)as-preprocessor.pl就去下載,可以說(shuō)作者在腳本文件內(nèi)部幫我們一次性搞定了。
我們從編譯開始講起,cd到下載的腳本目錄,然后執(zhí)行編譯命令./build-ffmpeng.sh,其實(shí)如果你下載后按照其他文章的步驟去編譯,100%是失敗的,下面是我在終端編譯的報(bào)錯(cuò)信息,屢試不爽,還有文章說(shuō):如果失敗,多嘗試幾次即可下載到,我試過(guò)很多次,都是失敗。
> FFmpeg source not found. Trying to download...
>
> % Total % Received % Xferd Average Speed Time Time Time Current
>
> Dload Upload Total Spent Left Speed
>
> 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
>
> building arm64...
>
> ./build-ffmpeg.sh: line 134: /Users/apple/Downloads/FFmpeg-iOS-build-script-master-2/ffmpeg-3.4.2/configure: No such file or directory
仔細(xì)看這句/Users/apple/Downloads/FFmpeg-iOS-build-script-master-2/ffmpeg-3.4.2/configure: No such file or directory。意思是下載ffmpeg3.4.2的時(shí)候發(fā)現(xiàn)找不到文件(No such file or directory),瞬間懵逼了,說(shuō)好的封裝呢?說(shuō)好的內(nèi)部處理呢?都TM是騙人的。下面是一個(gè)我隨便在簡(jiǎn)書上找到的編譯教程截圖,不知道作者有沒(méi)有試過(guò),就寫出來(lái),坑爹,一句話就帶過(guò)了,看了他的文章等于沒(méi)看,就給了一個(gè)編譯命令./build-ffmpeng.sh。
其實(shí)安裝他們的教程我們是離成功只有一步之遙,那就是我們需要修改一下build-ffmpeg.sh文件,把里面的FF_VERSION="3.4.2"改一下,改為FF_VERSION="3.4",3.4.2是一個(gè)3.4版本的小分支,目前不知道為什么是下載不到的,只能下載3.4主分支,修改后就可以輕松編譯通過(guò)了。所以我們得出一個(gè)結(jié)論,如果拉取不到小分支,那么就去拉取主分支;如果主分支也拉取不到,那么你就要去看看是否存在這個(gè)版本的主分支,F(xiàn)F_VERSION對(duì)應(yīng)的版本號(hào)不是亂寫上去的,是要去官網(wǎng)查看有哪些版本release了,然后去對(duì)應(yīng)你想要的版本,copy一個(gè)版本號(hào)到FF_VERSION這里,千萬(wàn)不能隨心所欲,寫一個(gè)不存在的版本。
但是編譯成功了也是3.4版本,或者是3.4以下的版本呀,并不是最新版本呀!怎么才能呼應(yīng)到文章的標(biāo)題,編譯任意版本的FFmpeg。
要想下載3.4版本以上的FFmpeg版本,比如如果想下載最新的4.0.1,就需要更復(fù)雜的步驟,這個(gè)已經(jīng)有大神編譯成功了,我們只要按照下面這個(gè)鏈接的步驟認(rèn)真去做,那么我們最后肯定會(huì)得到一個(gè)編譯失?。。?!
https://github.com/DeviLeo/DLGPlayer/blob/master/How_to_build_ffmpeg_with_openssl.md。
哈哈,毫不夸張,我編譯這幾個(gè)版本的FFmpeg,周六周日每天都編譯到凌晨3點(diǎn)左右,最終還是給我編譯出來(lái)了。其實(shí)我們需要修改FF_VERSION為4.0.1就可以了,而作者明確的是寫4.0,下面有圖為證。又一次被坑,這個(gè)是主分支下載不到,要用小分支4.0.1。
但是還是要感謝一下作者,其他的步驟特別詳細(xì),特別清楚,只要大家跟著步驟做,然后修改我讓大家修改的地方,就一定可以編譯成功。
至此我們應(yīng)該是有能力去編譯任意版本的FFmpeg了,感謝大家的閱讀。