iOS開發(fā)之ijkplayer的打包framework

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

本文為 iOS 的編譯打包過程, 環(huán)境為 Mac + Xcode

準備工作

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

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

ps:報錯-->(Warning: /usr/local/bin is not in your PATH.)

終端輸入命令: export PATH=/usr/local/bin:$PATH

獲取 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

image.png

打包 framwork

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

1.配置 Release 模式如果下圖

image.png

image.png

2.打包真機 framework
選擇你連接的手機或者Generic iOS Device
image.png

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

如果之前的步驟刪除了 compile-ffmpeg.sharmv7, 這里會報錯, 我們直接注釋掉就好(小伙伴仔細看啊,下面兩張圖不一樣的)

image.png

image.png

具體路徑

----> /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

具體文件路徑這樣查看

image.png

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

4.合并 framework

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

image.png

image.png

準備合并:
打開終端, 先 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 了。

image.png

image.png

集成 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 頭文件運行一下項目, 如果遇到了類似這樣的錯誤:
    image.png

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

打好的包在這里,小伙伴也可以直接下載使用(打包時間:2019-10-16
包鏈接:https://pan.baidu.com/s/1HmrrkwZr9YANZma-QGjGzw 密碼:mwbp
收工

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。