問(wèn)題描述
如果一個(gè)iOS app中使用了多個(gè)直播框架悦荒,并且這兩個(gè)框架都依賴了ffmpeg顿仇,比如一個(gè)app中使用了IJKPlayer.framework和360水滴SDK裁奇,那么就可能出現(xiàn)其中一個(gè)框架無(wú)法播放視頻或者無(wú)法編譯的問(wèn)題季蚂。
目標(biāo)
app中原使用了自定義直播協(xié)議的以ffpmeg解碼的視頻直播SDK〔辶洌現(xiàn)在要能夠播放RTMP協(xié)議的視頻源。
嘗試方案一
使用自己寫(xiě)的以ffmpeg為核心的編解碼視頻庫(kù)SDK近速。該SDK包括錄制诈嘿、保存堪旧、推流、直播等功能永淌,因?yàn)椴缓貌鸾馄槌。拷尤胗行┕δ苁褂貌坏剑虼朔艞壎x擇IJKPlayer遂蛀。編譯接入IJKPlayer用來(lái)播放RTMP協(xié)議的視頻源谭跨,原SDK保持不變。當(dāng)接入IJKPlayer.framework后可以編譯通過(guò)李滴,但原直播視頻無(wú)法播放螃宙。原因是兩個(gè)框架都依賴了ffmpeg,兩者的ffmpeg不兼容所坯。因?yàn)椴淮_定原直播SDK的ffmpeg是否做了改變谆扎,因此沒(méi)有選擇統(tǒng)一ffmpeg版本的解決方案。
IJKPlayer: ?https://github.com/bilibili/ijkplayer
IJKPlayer的應(yīng)用:https://github.com/zhangfangtaozft/ZFTPlayer
嘗試方案二
因?yàn)椴淮_定原直播SDK的ffmpeg是否做了改變芹助,不能選擇統(tǒng)一ffmpeg版本的解決方案堂湖,因此使用VLCPlayer,VLCPlayer未依賴ffmpeg状土。
VLC:?https://github.com/videolan/vlc
VLCPlayerd的應(yīng)用:https://github.com/dklinzh/DLCMobilePlayer
當(dāng)接入VLCPlayer.framework后出現(xiàn)跟方案一同樣的問(wèn)題无蜂。經(jīng)過(guò)查找VLCPlayer底層得知:
VLC does not embed FFmpeg as a sort of slave binary used internally, as you possibly could suppose. Instead, both FFmpeg and VLC are using?libavcodec, a library which implement what ffmpeg exposes through its command line interface. So, FFmpeg supports VLC through supplying its libavcodec library to be one of the essential components on which the VLC is built as a player app.
引自:https://stackoverflow.com/questions/11525769/how-do-vlc-and-ffmpeg-work-together
因此放棄這種解決方案。
嘗試方案三:
經(jīng)確認(rèn)原視頻播放軟件的ffmpeg已做過(guò)修改蒙谓,因此嘗試使用一個(gè)ffmpeg版本兼容兩套視頻解碼方式的方案斥季。
1. 首先確定版本號(hào):ff4.1時(shí),云室可播放累驮,ijk閃退酣倾,提示如下圖。
2. ?編譯ff3.2版本谤专。ijkplayer可以播放躁锡,云室內(nèi)不可以播放。
使用一鍵編譯腳本:https://github.com/kewlbear/FFmpeg-iOS-build-script
3. ?放棄ff3.2版本置侍,全部升級(jí)到ff4.1映之。編譯ff4.1的ijkplayer。
編譯以ff4.0步驟:https://juejin.im/post/5bfd3b73e51d456ee054a22b
ijkplayer依賴的ffmpeg:?https://github.com/bilibili/FFmpeg/releases墅垮。使用上面的編譯腳本編譯?ff4.0--ijk0.8.25--20190305--001成功惕医。注意要在build-ffmpeg.sh中去掉armv7的編譯耕漱。將該ffmpeg放在工程中算色,出現(xiàn)如下報(bào)錯(cuò):(放棄)
4. 使用ijkplayer提供的編譯腳本編譯出現(xiàn)兩個(gè)報(bào)錯(cuò):圖一表示去掉armv7的編譯。圖二表示在config/module-lite中去掉報(bào)錯(cuò)中為未識(shí)別的optional螟够。編譯成功
合成模擬器和真機(jī)IJKMediaPlayer.framework: ?http://www.reibang.com/p/7b2f1df74420
5. 將合成的framework放到工程中灾梦,出現(xiàn)如下報(bào)錯(cuò)峡钓。猜測(cè)ijkplayer的編譯腳本有問(wèn)題,因此將使用上面第三條中編譯的ffmpeg替換到工程中若河。
編譯成功D苎摇!萧福!
6. 通過(guò)使用文件對(duì)比工具拉鹃,查找云室ffmpeg與新編譯ffmpeg的差別,兼容解碼方式鲫忍。(一般不會(huì)遇到該情況膏燕,請(qǐng)略過(guò),遇到了只有幸運(yùn)者才能兼容)悟民。
兼容后:
播放云室內(nèi)視頻坝辫,有畫(huà)面,且流暢I淇鳌=Α!
播放RTMP視頻智润,有畫(huà)面及舍,且流暢!W鲇ァ击纬!
至此 ??