开源播放器 ijkplayer (六) :Android 下使用 ijkplayer 异常处理思路
一、 java.lang.IllegalStateException: mpjni: setOptionLong: null mp
根据已查到的资料看,目前是ijk内部的问题,只能通过try&catch的方式进行处理。
参考:https://github.com/CarGuo/GSYVideoPlayer/issues/654
参考:https://github.com/bilibili/ijkplayer/issues/2136
二、暂停的时候,退到后台再回到前台,画面黑屏
1. 可以在暂停的时候,通过TextureView.getBitmap(point.x, point.y);
获取到暂停的画面,用ImageView显示它,在onSurfaceTextureUpdated
的时候隐藏ImageView,来实现画面的衔接。
2. 暂停时绘制静态画面多TextureView的Surface上,详细参考GSYVideoPlayer。
三、ijk在切换URL时报400错误(http与https域名共用)
ijkplayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
四、ijkplayer onComplete异常回调
现象描述:
在Android手机上,播放视频,在播放的时候把网络关闭,当player把buffer播放完成后,会回调onCompletion和onError方法,但是视频实际上还没播放完毕。
ijkplayer 项目此问题 Issues汇总:
https://github.com/bilibili/ijkplayer/issues/193
https://github.com/bilibili/ijkplayer/issues/525
https://github.com/bilibili/ijkplayer/issues/1289
https://github.com/bilibili/ijkplayer/issues/1580
优化方案:
增加播放失败的重试机制,将-10000这个错误进行处理,给用户重试的机制。
同时,如果收到播放完成的回调的时候,增加判断逻辑,如果当前播放的时长距真正结束超过5秒,则不做播放结束的处理。
五、ijkplayer reset()操作导致ANR
问题:IjkMediaPlayer reset() 耗时,release() 在音频未加载完时,也是耗时操作
解决:使用两个队列,一个存放可以使用的IjkMediaPlayer,一个存放待 释放的IjkMediaPlayer,待释放播放器在线程里 reset。