Mac全量编译ijkplayer生成Android库
ijkplayer編譯
Pangu-Immortal (Pangu-Immortal) · GitHub
GitHub地址:GitHub - bilibili/ijkplayer: Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support.
最近做新人培訓,講了下編譯過程,發現很多人拉不下代碼,也編譯不過去。我用一臺新電腦重新梳理了一個新環境會遇到哪些坑,這里簡單記錄一下完整的內容和踩過的坑。
1. 環境準備
# install homebrew, git, yasm ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew install git brew install yasm- Android SDK(官網下)
- 不受支持的 NDK 下載(android-ndk-r14b,官方使用的r10。這里不能高于r14b,否則編譯不過)?
2. 設置環境
在你的環境變量里面加入路徑
open .bash_profile編輯好了保存,生效用下面命令,這里針對的當前窗口的上下文 source .bash_profile環境變量很簡單,如果不會可以隨意搜索就能找到答案。
3.下載ijk代碼
? ? ? ?這個需要安裝git,可以參考網上各種教程,比較簡單。我的mac因為之前安裝了git的桌面客戶端,所以就有了git環境,不需要額外配置。
# 克隆到ijkplayer-android目錄 git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android# 進入ijkplayer-android目錄 cd ijkplayer-android # 檢出最新版本 git checkout -B latest k0.8.84.編譯前選擇你的配置,就是自動化編譯時的一些配置選項,比如支持什么協議啊,支持什么音視頻類型等,
官方提供了三個模板給我們使用:
- module-default.sh:默認,如果你喜歡更多類型可以用這個;
- module-lite-hevc.sh:如果您更喜歡較小的二進制大小的編解碼器/格式(包括hevc功能)
- module-lite.sh:如果您更喜歡較小的二進制大小的編解碼器/格式(默認情況下)
使用的時候如下:
cd config rm module.sh ln -s module-default.sh module.sh5.初始化FFMPEG
./init-android.sh這個是下載FFMPEG的源碼,下載過程會很慢。下載過程中extra\ffmpeg文件夾的內容會變化。
如果視頻播放需要支持Https協議,還需要執行如下命令:
./init-android-openssl.sh終端如果不配置代理會很慢,電腦開了VPN和終端是兩回事,終端依然不走代理流量,除非是代理全部流量。
# 打開terminal,使用代理。例如,這里只是舉個例子,IP和端口用自己的。export http_proxy=http://127.0.0.1:50122 export https_proxy=http://127.0.0.1:50122 export ALL_PROXY=socks5://127.0.0.1:501216.編譯
cd android/contrib執行清除命令,然后編譯需要的so,這里的all是生成所有版本的,如果只需要對應版本的,可以把all替換成armv7a等你需要的版本。編譯需要很長時間。
編譯openssl
./compile-openssl.sh clean ./compile-openssl.sh all編譯ffmpeg
./compile-ffmpeg.sh clean ./compile-ffmpeg.sh all在編譯ffmpeg的時候出現Unknown option "--disable-ffserver"錯誤.
因為:ffmpeg4.0刪了ffserver
-------------------------------------------------------------------------------------------------------------
將config/module.sh中的
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vda"?
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver"
注釋了就可以了......
--------------------------------------------------------------------------------------------------------------
在module.sh 最底部增加以下兩行
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib"
-------------------------------------------------------------------------------------------------------------
?? 提示NDK環境問題時請注意:(ijk只認 ANDROID_NDK,ANDROID_SDK 兩個字段)
You must define ANDROID_NDK, ANDROID_SDK before starting.
They must point to your NDK and SDK directories.
需要特殊的配置,并非環境配置不對。。
需要額外增加一個:
在原來環境變量的基礎上,必須增加這兩行。因為ijk比較老了,識別老的方式。 # export ANDROID_SDK=<your sdk path> # export ANDROID_NDK=<your ndk path># NDK
export ANDROID_NDK=/Users/qihao/android-ndk-r14b/
# SDK
ANDROID_HOME=/Users/qihao/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/tools
export ANDROID_SDK=/Users/qihao/Library/Android/sdk
編譯0.8.8版本的ijk,./compile-ffmpeg.sh all,出現了linux/perf_event.h: No such file or directory
# 在moule.sh文件加入如下兩句即可: export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib"# 然后clean一下再編譯。 ./compile-ffmpeg.sh clean ./compile-ffmpeg.sh all看最后一行,有一句提示:運行如下腳本編譯成so庫。
Pangu-Immortal (Pangu-Immortal) · GitHub
cd .. 退到上一級目錄,看一眼,有個compile-ijk.sh文件。# to continue to build ijkplayer, run script below, sh compile-ijk.sh 不帶all只有v7a全版本 ./compile-ijk.sh all7.到此就算編譯完成了。然后找到ijkplayer目錄使用Android studio打開即可。
關于如何運行android studio集成ijkplayer
Pangu-Immortal (Pangu-Immortal) · GitHub
- 1.導入到你的項目中
android studio打開你的項目,File- Import Module…選擇ijkplayer的anroid/ijkplayer目錄,ijk-example依賴所有庫,所以導入后所有項目都會導入到你的項目中。
- 2.將android/ijkplayer目錄下的tools文件夾也拷貝到自己項目的根目錄下。
- 3. 在ijkplayer-java\src\main\目錄下新建一個名為jniLibs的文件夾,將各個ijkplayer-xxx目錄中的\src\main\libs目錄下的文件夾拷貝到jniLibs文件夾中,如:ijkplayer–armv7a的該目錄下包含armeabi-v7a這個文件夾,其中包含了該平臺對應的.so文件,如果希望包含所有平臺的,就將所有ijkplayer-xxx下的全部拷過來,如果只希望某幾個平臺的,就只拷貝它們的。
- 4.將ijkplayer-xxx的目錄全部從項目中刪除掉,只保留ijkplayer-example、ijkplayer-java、ijkplayer-exo以及tools文件夾,其中ijkplayer-example依賴于后面幾個。
- 5.將ijkplayer-example修改為Module的形式,因為ijkplayer-example本身是一個application工程,默認不生成aar文件,且里面的資源互相依賴,難以像舊版本通過復制所需的幾個java文件到自己工程中的方式來使用,所以不如將整個ijkplayer-example轉換為我們工程的一個Module。具體方法是:
注意:
這幾個修改為自己安裝的版本。
- 6.在ijkplayer-example根目錄下增加一個gradle.properties文件,內容如下:
- 7.在自己的項目中添加依賴項,完成上述操作,點擊async gradle即可。
其他錯誤:
如果出現
Error:(3) Error retrieving parent for item: No resource found that matches the given name ‘android:TextAppearance.Material.Widget.Button.Borderless.Colored’.
如上類似錯誤,那是幾個項目的sdk版本不同引起的,四個項目包含你自己的項目的compileSdkVersion 、
buildToolsVersion、targetSdkVersion和compile ‘com.android.support:appcompat-v7:25.0.0’ 幾個版本必須要統一,如果不統一會出現各種問題。
以上就是本文的全部內容,希望對大家的學習有所幫助。
總結
以上是生活随笔為你收集整理的Mac全量编译ijkplayer生成Android库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kotlin替换Dagger2/Hilt
- 下一篇: Coil - Google推荐的协程图片