1.安装Cygwin
按照https://blog.csdn.net/w1072654398/article/details/87369472安装,一步不差,里面就包含了必须的git,make,gcc,ysam,如果在Choess Download Site选择没有地址,可以自己添加阿里的http://mirrors.aliyun.com/cygwin/
2.下载sdk和ndk
Android的sdk,这个都有,NDK按照要求是要r10e的,按照系统下载:
ndk_r10e(Jan 2015)
Windows32-bit : http://dl.google.com/android/ndk/android-ndk-r10e-windows-x86.exe
Windows64-bit : http://dl.google.com/android/ndk/android-ndk-r10e-windows-x86_64.exe
3.修改配置
3.1
打开C:\cygwin64\home\ws\~/.bash_profile 或 ~/.profile文件,在最后添加
export ANDROID_SDK=F:/work/ASSDK/sdk
export ANDROID_NDK=F:/work/ASSDK/android-ndk-r10e
按照自己的sdk和ndk地址,注意斜杠
3.2
删除C:\cygwin64\home\ws\ijkplayer\android\ijkplayer\player-armv7a\src\main\jni下的ijkmedia和android-ndk-prof文件,没有就不用
修改C:\cygwin64\home\ws\ijkplayer\android\compile-ijk.sh文件,找到do_sub_cmd ()方法,注释掉代码
4.打开桌面Cygwin快捷方式,下载ijk,依次输入
#目前b站更新在两年前的0.8.8就不再更新了
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer
cd ijkplayer
git checkout -B latest k0.8.8
5.下载ffmpeg
#回到ijkplayer目录,开始下载ffmpeg源码,300多M看网速
cd ..
./init-android.sh
6.下载完成,如果之后要重新编译或者关闭了Cygwin重开,都不用再下载了从这里开始
cd config
rm module.sh
#可以根据自己需求更改,ln -s module-lite.sh module.sh或者ln -s module-lite-hevc.sh module.sh,这是目录里面给我们提供的,hevc就是H265解码
ln -s module-default.sh module.sh
7.编译ffmpeg
#进入contrib目录先清空一下ffmpeg配置
cd ..
cd android/contrib
./compile-ffmpeg.sh clean
#这里如果要全量就./compile-ffmpeg.sh all,否则就选想要的,这里会很慢,刚开始会停留以为卡死,不用管,然后编译过程中会输出各种错误不用管,等它编译完成,一般最终都会成功大概10多分钟
./compile-ffmpeg.sh armv7a
8.编译ijk
#回到android目录,同理这里用armv7a,全量all
cd ..
./compile-ijk.sh armv7a
9.完成,直接把ijkplayer/android/ijkplayer文件夹导入AS工程,编译问题
默认的gradle版本太低,换成你目前的,会报错
9.1
Error:A problem occurred configuring project ':ijkplayer-example'.
All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
在网上查了查,只要在ijkplayer-example的build.gradle的defaultConfig内添加
#800800是根据project的build.gradle中的ext.verionCode值来定的,保持一致
flavorDimensions "800800"
9.2
Error:error: '@@array/pref_entries_player' is incompatible with attribute android:entries (attr) reference
打开相应文件,去掉一个@,写错了
9.3
要支持硬解码功能,参数设置要改ijkplayer-example\src\main\java\tv\danmaku\ijk\media\example\widget\media\IjkVideoView.java
在方法public IMediaPlayercreatePlayer(int playerType)中的defalut逻辑中:
// 原本逻辑
// ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
// 修改逻辑,需要改成mediacodec-hevc这个参数才可以设置硬解码,注意不是下划线,网上很多写配置mediacodec_all_videos或者mediacodec_hevc都是下划线都是错误的
// 参考解答 https://github.com/bilibili/ijkplayer/issues/855 https://github.com/bilibili/ijkplayer/issues/922
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-hevc", 1);
10.是否支持265硬编解码
// 是否支持265硬解码
public static boolean isH265DecoderSupport() {
int count = MediaCodecList.getCodecCount();
for (int i =0; i < count; i++) {
MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i);
if (info.isEncoder()) {
continue;
}
String name = info.getName().toLowerCase();
if (name.contains("decoder") && name.contains("hevc")) {
return true;
}
}
return false;
}
// 是否支持265硬编码
public static boolean isH265EncoderSupport() {
int count = MediaCodecList.getCodecCount();
for (int i =0; i < count; i++) {
MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i);
if (!info.isEncoder()) {
continue;
}
String name = info.getName().toLowerCase();
if (name.contains("encoder") && name.contains("hevc")) {
return true;
}
}
return false;
}
11.参考
https://blog.csdn.net/w1072654398/article/details/87369472
https://blog.csdn.net/u010072711/article/details/51354834