【iOS開發】ijkplayer 的編譯、打包 framework 和 https 支持

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

ARM

ARM處理器,特點是體積小、低功耗、低成本、高性能,所以幾乎所有手機處理器都基于ARM,在嵌入式系統中應用廣泛。

ARM處理器指令集

armv6|armv7|armv7s|arm64都是ARM處理器的指令集,這些指令集都是向下兼容的,例如armv7指令集兼容armv6,只是使用armv6的時候無法發揮出其性能,無法使用armv7的新特性,從而會導致程序執行效率沒那么高。

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

目前iOS移動設備指令集

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架構

模擬器64位處理器測試需要x86_64架構

真機32位處理器需要armv7,或者armv7s架構

真機64位處理器需要arm64架構

準備工作

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

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

獲取 ijkplayer 源碼

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

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

# 進入到剛剛新建的文件夾內
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

# 可根據需要替換為`module-default.sh`, `module-lite-hevc.sh`, `module-lite.sh`
# 創建軟鏈接 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 的靜態文件 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`, 請執行`sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/`, 再重新執行下一步

# 編譯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 已經弱化了對 32 位的支持, 解決方法:
compile-ffmpeg.sh 中刪除 armv7 , 修改如:
FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"



再重新執行出現錯誤的命令: ./compile-ffmpeg.sh all

打開 IJKMediaPlayer 項目

用命令:

open IJKMediaPlayer/IJKMediaPlayer.xcodeproj

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

添加 openssl 相關包以支持 https

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

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

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

圖(1)

打包 framwork

大家會發現除了 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 導入項目即可; 一般我們為了方便會合并 framework, 這樣就同時支持模擬器和真機運行.

    先找到生成 framework 的目錄:

    圖(8)
    圖(9)

    準備合并:

    打開終端, 先 cdProducts 目錄下

    然后執行: 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 放到百度網盤中
鏈接:https://pan.baidu.com/s/19q8V4bcRvjq4Vae7UmmwQQ 密碼:004b

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

推薦閱讀更多精彩內容