8K播放网络全终端播放器H5播放器网页直播/点播播放器EasyPlayer-Android直播画面卡在第一帧问题修复
EasyPlayer-Android播放器是一款可针对RTSP、RTMP、RTSP&RTMP协议进行过优化的流媒体播放器,其中我们引以为傲的两个技术优势就是起播速度快和播放延迟低。
在我们用安卓手机进行EasyPlayer的测试时,发现某些手机在运行EasyPlayer播放视频时,画面会停留在第一帧,虽然有码率预示着接收端没有问题,但是画面却卡着不动。
分析问题
一般来讲,这个现象有三种原因导致:
- 没有接收到视频帧;
- 解码器出错,只解出了第一帧图像;
- 时间戳计算有误,导致长时间sleep。
我们逐一排查下。
首先在媒体帧回调的地方下个断点,发现的确有视频帧接收到,并且视频帧最终正常地push到解码的队列当中了,说明不是第一个原因。
其次,我们看看解码器,似乎也正常工作,没有打印任何异常信息,解码线程也并未退出。那么第二个原因也初步排除。
最后,我们尝试重新播放,跟进到解码线程里面,发现最终sleep时间大的惊人,解码线程解完首帧后就一直在睡眠状态了。再跟踪一次,发现是硬解码初始化失败,自动切换到软解码,而在软解码完成首帧解码后,未把该帧的时间戳赋值给时间戳,这样实际上首帧时间戳为0了,后续视频帧的时间戳与首帧时间戳相隔太大,sleep时间也随之变得很大。
解决问题
这个bug实际上比较少见,只有某些手机在硬解码出错后,自动切换到软解码的情况下才会出现,现如今大多数手机硬解码都能正常工作。如出现这种原因,我们只需将时间戳恢复正常即可。