【iOS開發(fā)】ijkplayer 的編譯毕莱、打包 framework 和 https 支持

ijkplayerbilibili 開源的一款優(yōu)秀的播放器, 基于 FFmpeg, 支持 iOS/Android, 點播/直播, 以及多種編碼. 官方并不直接提供 framework 框架包, 這樣大家可以根據(jù)需要選擇配置, 自己編譯并打包. 但是也讓很多第一次使用的小伙伴一臉懵逼, 并且默認配置只支持 http, 如果想播放 https 鏈接的視頻, 那么需要做額外的配置

ARM

ARM處理器,特點是體積小颅夺、低功耗朋截、低成本、高性能吧黄,所以幾乎所有手機處理器都基于ARM部服,在嵌入式系統(tǒng)中應用廣泛。

ARM處理器指令集

armv6|armv7|armv7s|arm64都是ARM處理器的指令集拗慨,這些指令集都是向下兼容的廓八,例如armv7指令集兼容armv6,只是使用armv6的時候無法發(fā)揮出其性能胆描,無法使用armv7的新特性瘫想,從而會導致程序執(zhí)行效率沒那么高。

還有兩個我們也很熟悉的指令集:i386|x86_64 是Mac處理器的指令集昌讲,i386是針對intel通用微處理器32架構(gòu)的国夜。x86_64是針對x86架構(gòu)的64位處理器。所以當使用iOS模擬器的時候會遇到i386|x86_64短绸,ios模擬器沒有arm指令集车吹。

目前iOS移動設(shè)備指令集

arm64:iPhone6s | iphone6s plus|iPhone6| iPhone6 plus|iPhone5S | iPad Air| iPad mini2(iPad mini with Retina Display)

armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)

armv7:iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4

模擬器32位處理器測試需要i386架構(gòu)

模擬器64位處理器測試需要x86_64架構(gòu)

真機32位處理器需要armv7,或者armv7s架構(gòu)

真機64位處理器需要arm64架構(gòu)

準備工作

安裝 homebrew, git, yasm. (如果已經(jīng)安裝好可以跳過, 不清楚的再來一遍也無妨)

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install git
brew install yasm

獲取 ijkplayer 源碼

在一個合適的位置新建一個文件夾, 假設(shè)為桌面, 文件夾名為 ijkplayer.

打開終端, 輸入下面的指令

# 進入到剛剛新建的文件夾內(nèi)
cd ~/Desktop/ijkplayer/

# 獲取ijkplayer源碼
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios

# 進入源碼目錄
cd ijkplayer-ios

# 切換分支 (目前為k0.8.8, 可以自行去GitHub查看最新版本號)
git checkout -B latest k0.8.8

配置編解碼器格式支持

默認為最少支持, 如果足夠你使用, 可以跳過這一步. 否則可以改為以下配置:

  • module-default.sh 更多的編解碼器/格式
  • module-lite-hevc.sh 較少的編解碼器/格式(包括hevc)
  • module-lite.sh 較少的編解碼器/格式(默認情況)
# 進入 config 目錄
cd config

# 刪除當前的 module.sh 文件
rm module.sh

# 可根據(jù)需要替換為`module-default.sh`, `module-lite-hevc.sh`, `module-lite.sh`
# 創(chuàng)建軟鏈接 module.sh 指向 module-lite-hevc.sh
ln -s module-lite-hevc.sh module.sh

cd ..
cd ios
sh compile-ffmpeg.sh clean

獲取 ffmpeg 并初始化

cd ..
./init-ios.sh

添加 https 支持

最后會生成支持 https 的靜態(tài)文件 libcrypto.alibssl.a, 如果不需要可以跳過這一步

# 獲取 openssl 并初始化
./init-ios-openssl.sh

cd ios

# 在模塊文件中添加一行配置 以啟用 openssl 組件
echo 'export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-openssl"' >> ../config/module.sh

./compile-ffmpeg.sh clean

編譯

# 如果下一步提示錯誤`xcrun: error: SDK "iphoneos" cannot be located`, 請執(zhí)行`sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/`, 再重新執(zhí)行下一步

# 編譯openssl, 如果不需要https可以跳過這一步
./compile-openssl.sh all

# 編譯ffmpeg
./compile-ffmpeg.sh all

ps: 如果提示錯誤:

./libavutil/arm/asm.S:50:9: error: unknown directive
        .arch armv7-a
        ^
make: *** [libavcodec/arm/aacpsdsp_neon.o] Error 1

最新的 Xcode 已經(jīng)弱化了對 32 位的支持, 解決方法:
compile-ffmpeg.sh 中刪除 armv7 , 修改如:
FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"



再重新執(zhí)行出現(xiàn)錯誤的命令: ./compile-ffmpeg.sh all

打開 IJKMediaPlayer 項目

用命令:

open IJKMediaPlayer/IJKMediaPlayer.xcodeproj

或者手動用 Xcode 打開 ios 目錄下的 IJKMediaPlayer 項目.

添加 openssl 相關(guān)包以支持 https

如果不使用 https, 可以跳過此步, 直接開始打包 framwork

如果使用 https, 那么需要手動給 IJKMediaFramework 添加 libcrypto.alibssl.a 文件, 默認不會添加

ps: 這兩個依賴庫的目錄為: ijkplayer-ios/ios/build/universal/lib, 只有進行了上面跟 openssl 相關(guān)的操作, 才會在這個目錄下有生成 libcrypto.alibssl.a

圖(1)

打包 framwork

大家會發(fā)現(xiàn)除了 IJKMediaFramework 這個 target, 還有一個叫 IJKMediaFrameworkWithSSL, 但是不推薦使用這個, 因為大部分基于 ijkplayer 的第三方框架都是使用的前者, 你把后者導入項目還是會報找不到包的錯誤, 就算你要支持 https 也推薦使用前者, 然后按照上一步添加 openssl 即可支持

  1. 配置 Release 模式如果下圖

    圖(2)
    圖(3)
  2. 打包真機 framework

    選擇你連接的手機或者 Generic iOS Device

    圖(4)

    如圖操作,然后按鍵 command+b 編譯即可

    如果之前的步驟刪除了 compile-ffmpeg.sharmv7, 這里會報錯, 我們直接注釋掉就好

    圖(5)
    圖(6)
  3. 打包模擬器 framework

    圖(7)

    如圖操作醋闭,然后 command+b 編譯即可
    報錯文件路徑
    /Users/chasitu/Desktop/ijkplayer/ijkplayer-ios/ios/build/universal/include/libavutil/avconfig.h
    /Users/chasitu/Desktop/ijkplayer/ijkplayer-ios/ios/build/universal/include/libffmpeg/config.h

  4. 合并 framework

    如果只需要真機運行或者模擬器運行, 可以不用合并, 直接找到對應的 framework 導入項目即可; 一般我們?yōu)榱朔奖銜喜?framework, 這樣就同時支持模擬器和真機運行.

    先找到生成 framework 的目錄:

    圖(8)
    圖(9)

    準備合并:

    打開終端, 先 cdProducts 目錄下

    然后執(zhí)行: lipo -create 真機framework路徑 模擬器framework路徑 -output 合并的文件路徑

    lipo -create Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output IJKMediaFramework
    
    

    合并完成:

    可以看到這里生成了一個大概兩倍大小的文件, 將生成的 IJKMediaFramework 文件替換掉 真機framework 中的 IJKMediaFramework 文件窄驹,然后這個替換掉文件的 真機framework 就是我們需要的 通用的framework 了。

    圖(10)
    圖(11)

集成 framework 到項目中

  • 導入 framework

    直接將 IJKMediaFramework.framework 拖入到工程中即可

    注意記得勾選 Copy items if needed 和 對應的 target

  • 添加下列依賴到工程

    1. libc++.tbd ( 編譯器選 gcc 的請導入 libstdc++.tbd )
    2. libz.tbd
    3. libbz2.tbd
    4. AudioToolbox.framework
    5. UIKit.framework
    6. CoreGraphics.framework
    7. AVFoundation.framework
    8. CoreMedia.framework
    9. CoreVideo.framework
    10. MediaPlayer.framework
    11. MobileCoreServices.framework
    12. OpenGLES.framework
    13. QuartzCore.framework
    14. VideoToolbox.framework

導入 ijkplayer 頭文件運行一下項目, 如果遇到了類似這樣的錯誤:

圖(12)

可能是因為導入的依賴庫不全, 比如缺少 libc++.tbd, 請再次對照添加好所有的依賴庫:

圖(13)

打包報錯

Undefined symbols for architecture armv7

image.png

解決方案一:

【target】 -> 【build settings】 -> 【architectures】 -> 【valid architectures】 刪除 armv7 (APP不支持32位的老機器)


image.png

解決方案二:
用Xcode9.3之前的版本打包 ijkplayer证逻,打包后Xcode編譯打包報
ld: symbol(s) not found for architecture arm64

建議用方案一
已編譯好 IJKPlayerFramework 支持https乐埠,不支持armv7 放到百度網(wǎng)盤中
鏈接:https://pan.baidu.com/s/19q8V4bcRvjq4Vae7UmmwQQ 密碼:004b

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市囚企,隨后出現(xiàn)的幾起案子丈咐,更是在濱河造成了極大的恐慌,老刑警劉巖龙宏,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棵逊,死亡現(xiàn)場離奇詭異,居然都是意外死亡银酗,警方通過查閱死者的電腦和手機辆影,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門徒像,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛙讥,你說我怎么就攤上這事锯蛀。” “怎么了键菱?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵谬墙,是天一觀的道長今布。 經(jīng)常有香客問我经备,道長,這世上最難降的妖魔是什么部默? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任侵蒙,我火速辦了婚禮,結(jié)果婚禮上傅蹂,老公的妹妹穿的比我還像新娘纷闺。我一直安慰自己,他們只是感情好份蝴,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布犁功。 她就那樣靜靜地躺著,像睡著了一般婚夫。 火紅的嫁衣襯著肌膚如雪浸卦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天案糙,我揣著相機與錄音限嫌,去河邊找鬼。 笑死时捌,一個胖子當著我的面吹牛怒医,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奢讨,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稚叹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拿诸?” 一聲冷哼從身側(cè)響起扒袖,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佳镜,沒想到半個月后僚稿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蟀伸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年蚀同,在試婚紗的時候發(fā)現(xiàn)自己被綠了缅刽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蠢络,死狀恐怖衰猛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刹孔,我是刑警寧澤啡省,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站髓霞,受9級特大地震影響卦睹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜方库,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一结序、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纵潦,春花似錦徐鹤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寥院,卻和暖如春劲赠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背只磷。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工经磅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钮追。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓预厌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親元媚。 傳聞我的和親對象是個殘疾皇子轧叽,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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