iOS ijkplayer編譯與支持https協(xié)議

環(huán)境

  • mac版本:MacBook Pro(Apple M1 Pro) M1芯片
  • Xcode版本:15.4

拉取代碼

按照 blibili官方開源庫ijkplayer README中iOS配置步驟進行配置。

# 先切到一個文件夾下
cd Desktop/

# 克隆ijkplayer的代碼
git clone https://github.com/Bilibili/ijkplayer.git

# cd到拉下來的ijkplayer中
cd ijkplayer

# 切到最新版本k0.8.8(可在官方tags中查看最新版本)
git checkout -B latest k0.8.8

項目拉下來后文件結(jié)構(gòu)如下:


拉下來的ijkplayer項目結(jié)構(gòu)
克隆成功樣式.png

配置解碼器類型

  • module-default.sh 更多的編解碼器/格式
  • module-lite-hevc.sh 較少的編解碼器/格式(包括hevc)
  • module-lite.sh 較少的編解碼器/格式(默認(rèn)情況)
cd config
# 刪除默認(rèn)的解碼器
rm module.sh

# 創(chuàng)建一個軟連接指向 module-lite-hevc.sh,這個可根據(jù)自己需求進行選擇
ln -s module-lite-hevc.sh module.sh

# 回到上一層目錄
cd ..

# 進入ios目錄
cd ios

# 將compile-ffmpeg.sh腳本清空空凸,等待后期重新執(zhí)行新的腳本
sh compile-ffmpeg.sh clean

注:sh compile-ffmpeg.sh clean./compile-ffmpeg.sh clean一樣澜倦,都是在當(dāng)前文件夾下執(zhí)行腳本命令

配置ffmpeg內(nèi)核版本

回到上一目錄ijkplayer找到init-ios.sh文件進行編輯捉蚤,可通過終端使用vi命令進入編輯環(huán)境,再輸入i開始編輯看尼,編輯結(jié)束后按鍵盤左上角上的esc鍵退出編輯坦报,然后在終端中輸入:wq進行保存并退出編輯環(huán)境, 或者找到該文件直接通過xcode打開開始修改。

# 回到上一目錄ijkplayer
cd ..

# 編輯init-ios.sh文件
vi init-ios.sh

打開文件后可以看到如下內(nèi)容休玩,需要注意IJK_FFMPEG_COMMIT字段著淆,該字段配置ffmpeg版本,如果不修改哥捕,則默認(rèn)使用ff3.4--ijk0.8.7--20180103--001版本牧抽,我們需要將其修改為ff4.0--ijk0.8.25--20200221--001
原本bilibiliffmpeg庫支持查看版本的遥赚,可惜現(xiàn)在看不到了扬舒。

#! /usr/bin/env bash
#
# Copyright (C) 2013-2015 Bilibili
# Copyright (C) 2013-2015 Zhang Rui <bbcallen@gmail.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# IJK_FFMPEG_UPSTREAM=git://git.videolan.org/ffmpeg.git
IJK_FFMPEG_UPSTREAM=https://github.com/Bilibili/FFmpeg.git
IJK_FFMPEG_FORK=https://github.com/Bilibili/FFmpeg.git
IJK_FFMPEG_COMMIT=ff4.0--ijk0.8.25--20200221--001
IJK_FFMPEG_LOCAL_REPO=extra/ffmpeg

IJK_GASP_UPSTREAM=https://github.com/Bilibili/gas-preprocessor.git

配置ffmpeg所依賴的環(huán)境

# 獲取依賴的文件,這個會久一點凫佛,中途有失敗再執(zhí)行一下就可以了
./init-ios.sh

配置支持https協(xié)議(如果不需要支持https可以跳過)

編輯ijkplayer文件夾下的init-ios-openssl.sh文件

vi init-ios-openssl.sh

和升級ffmpeg類似讲坎,找到IJK_OPENSSL_COMMIT字段,將其默認(rèn)值OpenSSL_1_0_2n替換成OpenSSL_1_0_2u愧薛。

配置https所需的openssl環(huán)境

# 比較耗時晨炕,耐心等待
./init-ios-openssl.sh

成功后終端輸出如下:


image.png

編輯config文件夾下的module.sh文件

vi config/module.sh

在文件的末尾加上如下兩行:

# 支持https
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-openssl"

# ffmpeg4.0 需要
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=eac3_core"

同時將以下兩行注釋掉:

#export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver"
#export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vda"

參考升級到ffmpeg到4.0

更改最低支持的版本到8.0

因為ffmpeg4.0使用的部分API是iOS8.0以上的,因此需要更改最低支持的版本超過8.0毫炉,否則編譯ffmpeg時會出現(xiàn)如下錯誤:

libavcodec/videotoolbox.c:862:9: error: 'VTDecompressionSessionInvalidate' is only available on iOS 8.0 or newer
      [-Werror,-Wunguarded-availability]
        VTDecompressionSessionInvalidate(videotoolbox->session);

依次找到ios/tools目錄下的do-compile-ffmpeg.shdo-compile-openssl.sh文件瓮栗,打開文件并找到有關(guān)version-min小于8.0的統(tǒng)一改為8.0

更改version-min為8.0.png

取消支持armv7編譯環(huán)境

因為使用Xcode15.4編譯瞄勾,已經(jīng)弱化了對32位的支持费奸,因此需要移除掉armv7環(huán)境。如果想支持armv7进陡,請使用低版本Xcode 例:Xcode9編譯打包愿阐。

找到ios目錄下的compile-ffmpeg.shcompile-openssl.sh文件,打開文件并將FF_ALL_ARCHS_IOS8_SDK="armv7 arm64 i386 x86_64"修改為FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64",否則可能會在編譯ffmpeg的時候出現(xiàn)以下報錯:

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

編譯openssl

cd ios
# 先編譯OpenSSL,如果不需要支持https可以跳過
./compile-openssl.sh all

編譯openssl成功后終端輸出如下:

編譯openssl成功.png

編譯openssl成功后項目在ios/build文件夾下多出了openssl-arm64揪罕、openssl-i386openssl-x86_64辛孵、universal四個文件夾,并在universal文件夾下的lib文件夾中多出了libcrypto.alibssl.a兩個文件

image.png

編譯ffmpeg

在編譯ffmpeg之前需要在ios/tools目錄中的do-compile-ffmpeg.sh文件中增加一行FFMPEG_CFLAGS="$FFMPEG_CFLAGS -Wno-error=incompatible-function-pointer-types"赡磅,否則會在編譯的時候提示指針問題魄缚。

# 編譯ffmpeg遇到的error問題
libavcodec/aarch64/h264dsp_init_aarch64.c:84:38: error: incompatible function pointer types assigning to 'h264_weight_func' (aka 'void (*)(unsigned char *, long, int, int, int, int)') from 'void (uint8_t *, int, int, int, int, int)' (aka 'void (unsigned char *, int, int, int, int, int)') [-Wincompatible-function-pointer-types]
        c->weight_h264_pixels_tab[0] = ff_weight_h264_pixels_16_neon;
                                     ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

參考編譯項目時 ffmpeg_arm64 指針類型報錯

解決編譯ffmpeg時提示錯我.png

開始編譯ffmpeg

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

編譯ffmpeg成功后終端輸出如下:

編譯ffmpeg成功后.png

編譯ffmpeg成功后項目在ios/build文件夾下多出了ffmpeg-arm64ffmpeg-i386仆邓、ffmpeg-x86_64鲜滩、universal四個文件夾,并在universal文件夾下的lib文件夾中多出了libavcodec.a节值、libavfilter.a徙硅、libavformat.alibavutil.a搞疗、libswresample.a嗓蘑、libswscale.a六個文件。

image.png

檢查項目

至此為止已經(jīng)編譯通過了匿乃,然后打開IJKMediaPlayer.xcodeproj文件查看ffmpeg所需要的庫是否已正確引用上

項目位置.png

ffmpeg依賴的庫.png

如果lib文件夾下各庫文件為紅色則表示未正確引用上桩皿,有可能是配置ffmpeg的步驟沒弄好,需要清空opensslffmpeg腳本重新加載幢炸。

# 清空openssl.sh腳本
./compile-openssl.sh clean

# 清空ffmpeg.sh腳本
./compile-ffmpeg.sh clean 

# 重新加載openssl腳本
./compile-openssl.sh all

# 重新加載ffmpeg腳本 
./compile-ffmpeg.sh all 

檢查通過后運行項目處理錯誤

IJKMediaFramework一運行發(fā)現(xiàn)demo中有一處方法沒返回值編譯不過去泄隔,添加上返回值。

image.png

如需支持https協(xié)議需在IJKMediaPlayer中增加上編譯完openssl后生成的兩個庫文件

如果不增加這兩個庫文件宛徊,在運行IJKMediaDemo的時候會報錯佛嬉。

image.png

運行IJKMediaDemo

運行之后報錯如下:

image.png

發(fā)現(xiàn)之前配置opensslffmpeg的時候設(shè)置最低8.0,由于demo中Minimum Deployments值是7.0闸天,版本太低需將其提高(不知道為什么8.0不行暖呕,改為9.0正常了)

打包framework

配置為Release模式,使的編譯狀態(tài)即可打包出framework苞氮。

image.png
image.png

分別選擇真機環(huán)境及模擬器環(huán)境編譯一遍湾揽,然后在設(shè)置中的Locations分欄中點擊箭頭跳到編譯后的目錄,找到真機包和模擬器包笼吟。

image.png
image.png
image.png

lipo命令查看包支持的環(huán)境及合并包

  • lipo命令查看包支持的環(huán)境
    在終端中輸入lipo -info framework地址獲取該包支持的環(huán)境
lipo -info /Users/***/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-flteyzdokpvvjrggfniynketqxrr/Build/Products/Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework
Architectures in the fat file: /Users/***/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-flteyzdokpvvjrggfniynketqxrr/Build/Products/Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework are: arm64 x86_64 

可以看到該模擬器包支持arm64x86_64指令集

  • lipo命令合并真機與模擬器包
    在終端中輸入lipo -create 真機包地址 模擬器包地址 -output 包名稱將真機包與模擬器包合并為一個新的包同時支持兩種編譯環(huán)境库物。

值得注意的是:Apple發(fā)布M1芯片之前,一直使用Intel的芯片赞厕,沒有出現(xiàn)什么問題艳狐。發(fā)布 M1芯片后,由于兩者架構(gòu)的不同(M1arm64架構(gòu)皿桑,Intelx86_64的架構(gòu))毫目,導(dǎo)致lipo -create命令在執(zhí)行的時候會出現(xiàn)如下錯誤:

lipo -create /Users/***/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-flteyzdokpvvjrggfniynketqxrr/Build/Products/Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework  /Users/***/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-flteyzdokpvvjrggfniynketqxrr/Build/Products/Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework  -output IJKMediaFramework
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /Users/***/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-flteyzdokpvvjrggfniynketqxrr/Build/Products/Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework and /Users/***/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-flteyzdokpvvjrggfniynketqxrr/Build/Products/Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework have the same architectures (arm64) and can't be in the same fat output file

在我們創(chuàng)建framework時,選擇真機編譯出來的包只包含arm64指令诲侮,選擇模擬器編譯出來的包會同時包含arm64x86_64指令镀虐。有網(wǎng)上教程說將模擬器部分的arm64指令移除,但是要支持M1機器正常跑模擬器環(huán)境沟绪,必須同時包含arm64x86_64指令刮便。

解決方案:2019年的WWDC,蘋果提供了一種新的框架封裝格式XCFramework绽慈,簡單理解就是之前用lipo命令合并不同指令集的包恨旱,現(xiàn)在改為使用心得指令合并成XCFramework格式的包辈毯。

xcodebuild指令

實驗過很多次,仍舊無法解決在M1機器上編譯出的arm64+x86_64指令同時存在的framework改為xcframework搜贤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谆沃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仪芒,更是在濱河造成了極大的恐慌唁影,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掂名,死亡現(xiàn)場離奇詭異据沈,居然都是意外死亡,警方通過查閱死者的電腦和手機饺蔑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門锌介,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猾警,你說我怎么就攤上這事掏湾。” “怎么了肿嘲?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵融击,是天一觀的道長。 經(jīng)常有香客問我雳窟,道長尊浪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任封救,我火速辦了婚禮拇涤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘誉结。我一直安慰自己鹅士,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布惩坑。 她就那樣靜靜地躺著掉盅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪以舒。 梳的紋絲不亂的頭發(fā)上趾痘,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音蔓钟,去河邊找鬼永票。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侣集。 我是一名探鬼主播键俱,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼世分!你這毒婦竟也來了方妖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤罚攀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雌澄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斋泄,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年镐牺,在試婚紗的時候發(fā)現(xiàn)自己被綠了炫掐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡睬涧,死狀恐怖募胃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畦浓,我是刑警寧澤痹束,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站讶请,受9級特大地震影響祷嘶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夺溢,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一论巍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧风响,春花似錦嘉汰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至持搜,卻和暖如春接箫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朵诫。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工辛友, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓废累,卻偏偏與公主長得像邓梅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子邑滨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

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