目录
- 前言
- [1. ijkplayer-java:0.8.0](#1. ijkplayer-java:0.8.0)
- [2. 64位手机上,IMediaPlayer.prepareAsync()闪退](#2. 64位手机上,IMediaPlayer.prepareAsync()闪退)
前言
IjkPlayer是B站开源的播放器,可以支持本地播放,视频直播等功能。
GitHub地址:https://github.com/Bilibili/ijkplayer
感兴趣的小伙伴可以到GitHub上研究下源码,上面也记录了使用方法。
这里不讲IjkPlayer的使用方法,网上有很多资料可查询,请自行查找。
这里只记录在替换 ijkplayer-java:0.8.0 版本的64位so文件时遇到的问题。
1. ijkplayer-java:0.8.0
公司有个老项目接入了IjkPlayer 0.8.0 版本,当时导入的so文件只有:armeabi、armeabi-v7a、mips、x86:
build.gradle(app)文件里设置支持的SO库架构
java
defaultConfig {
........
ndk {
//设置支持的SO库架构
abiFilters "armeabi", "armeabi-v7a", "mips", "x86"
//"x86_64"
}
........
}
由于apk要上架到各大平台应用市场上,而应用市场要求上传的apk必须要适配64位的手机,否则不予上传,而当时接入的IjkPlayer 0.8.0并没有适配64位的so文件(接入的比较早,当时还没有64位手机的说法)。
所以接下来就去探索如何产生IjkPlayer 0.8.0 版本64位的so文件。
一开始想到的是下载IjkPlayer 0.8.0的源码,自行编译产生64位的so文件。于是在GitHub上下载了0.8.0版本的源码,GitHub上也记录了如何编译so文件的方法,同时在网上查阅了其它相关资料。折腾一圈发现,编译so文件的条件太苛刻:Mac环境、安装NDK、Linux系统上编译so库,看到这些就被劝退了。
IjkPlayer编译so 的一些学习资料,可供参考:
Mac m2芯片 全量编译ijkplayer生成Android库
【错误记录】编译 Android 版本的 ijkplayer 报错 ( You must define ANDROID_NDK before starting. | 下载指定版本 NDK )
Android IjkPlayer内核编译记(一)so库编译&使用
随后我在网上查找是否有已经编译好的 IjkPlayer 0.8.0 64位的so文件,终于让我找到了:
同时修改项目中的build.gradle,引入"tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.0"
java
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.0'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.0'
implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.0'
implementation 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.0'
implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.0'
并将 build.gradle(app)文件里设置支持的SO库架构代码去掉。
虽然arm64-v8a文件夹和armeabi、armeabi-v7a、mips、x86文件夹下的so文件名字不一样,但是确实能用(亲测)。
IjkPlayer 0.8.0 64位的so文件已上传,有需要的小伙伴自行下载。
2. 64位手机上,IMediaPlayer.prepareAsync()闪退
应用上架后,部分用户反馈64位手机看视频闪退。
问题分析:
经排查,该崩溃问题是安卓11对64位库的指针访问问题导致的。
原因:从安卓11开始,对于64位进程,进行加指针标记的功能,此功能意味着在访问内存时会忽略指针的顶部字节。这样的原因会导致播放器内核(ijkplayer)在播放网络视频的时候产生播放崩溃。
在工程的 AndroidManifest.xml 文件中添加以下内容:
java
<application
android:allowNativeHeapPointerTagging="false">
...
</application>
这将为应用停用指针标记功能,从而临时解决该问题。(已验证成功)
或者同步升级和更新sdk底层库使用的 ffmpeg和ijkplayer 到目前开源版本的最新代码,并同步更新主工程使用的sdk库。