ijkplayer -- Android编译64位so文件

目录

  • 前言
  • [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库。

相关推荐
折翅鵬8 分钟前
Android史诗级网络优化实践总结
android·网络
赏金术士2 小时前
Android 项目模块化与 Feature 组件实践
android·kotlin·模块化
summerkissyou19876 小时前
Android-UI-获取屏幕尺寸的方法
android·ui
用户86022504674726 小时前
Kotlin 函数式编程入门与实践指南
android
最爱睡觉睡觉睡觉8 小时前
CSS → Flutter 对照手册
android·前端
xingpanvip8 小时前
星盘接口开发文档:马盘次限盘接口指南
android·开发语言·python·php·lua
用户26190498561579 小时前
JUnit4 完整配置流程
android
用户26190498561579 小时前
JaCoCo 完整配置流程
android
QING61810 小时前
Android面试 —— 八股文之app启动流程
android·面试·app
海鸥-w10 小时前
python(fastapi) 实现更新,新增,删除接口
android·python·fastapi