環(huán)境:Ubuntu18.04
跟ffmpeg編譯類似检诗,不過沒有ffmpeg的編譯復雜酝枢。
幾個出錯點:
- 1.編譯ssl時發(fā)生:*
$ sudo ./compile-openssl.sh all
====================
[*] check archs
====================
FF_ALL_ARCHS = armv5 armv7a arm64 x86 x86_64
FF_ACT_ARCHS = armv5 armv7a arm64 x86 x86_64
You must define ANDROID_NDK before starting.
They must point to your NDK directories.\n
解決:
如果不是ndk路徑設置錯誤恬偷,很大 可能是權限問題,給父目錄設置權限:
sudo chmod -R 777 /xxx/
- 下面這個不是很重要帘睦,x86 架構袍患,可以不用管。網(wǎng)上有一種處理辦法竣付,是提前安裝依賴項:
sudo apt-get install python-pip python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev libjpeg8-dev zlib1g-dev
這個我沒有試過诡延。下面是錯誤信息:
Delta compression using up to 12 threads.
壓縮對象中: 100% (6502/6502), 完成.
寫入對象中: 100% (25071/25071), 完成.
Total 25071 (delta 15950), reused 25071 (delta 15950)
./init-android-openssl.sh: 第 35 行: cd: android/contrib/openssl-x86: 沒有那個文件或目錄
- 3.執(zhí)行*./compile-ffmpeg.sh all *時發(fā)生錯誤:
--------------------
[*] compile ffmpeg
--------------------
In file included from ./libavutil/internal.h:42:0,
from ./libavutil/common.h:467,
from ./libavutil/avutil.h:296,
from ./libavutil/avassert.h:31,
from libavfilter/aeval.c:26:
./libavutil/timer.h:38:31: fatal error: linux/perf_event.h: No such file or directory
# include <linux/perf_event.h>
^
compilation terminated.
make: *** [libavfilter/aeval.o] Error 1
解決:
回到config文件夾,在module-default.sh最底部增加以下兩行
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib"
重新執(zhí)行:
ln -s module-default.sh module.sh
然后回去:
cd ../android/contrib
繼續(xù)編譯ffmpeg
一古胆、準備工作
先進入項目官網(wǎng)肆良,查看目錄結構,選擇需要的分支拉取到本地逸绎。
選擇穩(wěn)定分支k0.8.8
源碼地址:https://github.com/bilibili/ijkplayer/tree/master
tag next
- ffmpeg: upgrade to 4.0
tag k0.8.8
- ffmpeg: upgrade to 3.4
- ffmpeg: fix hls some issue
- android: fix seek bug when no audio
- openssl: upgrade to 1.0.2n
- ios: vtb support h265
1. 安裝配置jdk, SDK, NDK
網(wǎng)上有人說jdk,sdk不配置也行惹恃,我的都配置過了。
- jdk:
sudo apt-get install openjdk-8-jdk
//配置環(huán)境變量:
sudo gedit /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
-
2.Android SDK:
1)手動下載 https://developer.android.google.cn/sdk/older_releases?hl=en2)進入目錄
/androidSDK/sdk-tools-linux/tools/bin
棺牧,
執(zhí)行./sdkmanager --list
命令看下有哪些目錄可以下載,, 然后把需要下載的目錄都下載下來:
./sdkmanager "add-ons;addon-google_apis-google-24" "add-ons;addon-google_apis-google-24" "platform-tools" "platforms;android-28" "tools"
3)環(huán)境變量
sudo gedit /etc/profile
export ANDROID_SDK=/home/jesen/Android/SDK/android-sdk-linux
export PATH=${PATH}:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
- NDK下載跟sdk一樣,版本不要太高巫糙,否則后面編譯會報
You need the NDKr10e or later
。
r14b下載
r10e下載
不過可以編譯前指定ndk版本找到do-detect-env.sh 腳本颊乘,路徑:ijkplayer-android/android/contrib/tools/do-detect-env.sh
修改里面的第71行 11|12|13|14)参淹,就是添加你所用的NDK版本)
下載完同樣配置環(huán)境變量:
export ANDROID_NDK=/home/jesen/Android/ndk/android-ndk-r14b
export PATH=$PATH:${ANDROID_NDK}
export ANDROID_NDK
二、編譯ijkplayer源碼
- 進入源碼目錄乏悄,執(zhí)行拉取ffmpeg:
sudo ./init-android.sh
- 拉取openssl:
Android系統(tǒng)自帶的播放器也是不支持https協(xié)議視頻的懈万,ijkplayer需要支持 Https 協(xié)議執(zhí)行如下命令
./init-android-openssl.sh
*進入 contrib 目錄,編譯各個平臺的編譯 openssl
cd android/contrib
./compile-openssl.sh clean
./compile-openssl.sh all
- 回到前面宵睦,進入config目錄,配置ffmpeg編譯參數(shù):
cd config
rm module.sh
ln -s module-default.sh module.sh
編譯 ffmpeg 解碼庫
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
編譯JNI代碼
cd ..
./compile-ijk.sh all
最后得到的產物在 二級目錄:xxx/android/ijkplayer下面吴叶,這是一個androidStudio工程捆姜,包含各個庫和demo:
三、運行效果
將該項目拷貝到本地AndroidStudio目錄下识啦,import 進AS。
實際上沒有像網(wǎng)上說的一導入就運行了神妹。實際上因為代碼構建版本太低颓哮,example這個module會報很多錯誤。
我的Gradle版本:
AndroidStudio: 3.14
Android Gradle Plugin Version 3.1.4
Gradle Version 6.5
可能需要修改gradle依賴:
compile to implementation
all64Compile to all64Implementation
-
錯誤1:
'All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com'
解決:
flavorDimensions rootProject.ext.versionName
defaultConfig {
applicationId "tv.danmaku.ijk.media.example"
minSdkVersion 9
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
flavorDimensions rootProject.ext.versionName
...
}
-
錯誤2:
Peek 2021-06-03 19-28.png
兩個@@資源引用錯誤鸵荠,改為一個@
- 錯誤3:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/tv.danmaku.ijk.media.example-1/base.apk"],nativeLibraryDirectories=[/data/app/tv.danmaku.ijk.media.example-1/lib/x86, /system/lib, /vendor/lib]]] couldn't find "libijkffmpeg.so"
at java.lang.Runtime.loadLibrary0(Runtime.java:984)
實際上libijkffmpeg.so已經被引入了冕茅,這種錯誤的原因是手機是64位的,我們的apk是32位,構建的時候需要注意構建64位apk:
效果: