BUG修复-EasyPlayer-RTSP卡在首帧的bug修改

存在的问题

最近我们发现某些Android安卓手机在运行EasyPlayer播放视频时,会停留在第一帧画面,虽然有码率预示着接收端没有问题,但是画面却卡着不动,如下图所示:

BUG修复-EasyPlayer-RTSP卡在首帧的bug修改

原因分析

一般来讲,导致这个现象有三种原因:

  • 没有接收到视频帧;
  • 解码器出错,只解出了第一帧图像;
  • 时间戳计算有误,导致长时间sleep。

找出问题

首先,在媒体帧回调的地方下个断点,发现的确有视频帧接收到,并且视频帧最终正常地push到解码的队列当中了,说明第一个假设不成立。

其次,我们看看解码器,似乎也正常工作,没有反馈任何异常信息;解码线程也并未退出,证明第二个原因也不存在。

最后,重新播放跟进到解码线程里面,发现最终sleep时间大的惊人,解码线程解完首帧后就一直在睡眠状态了。再跟踪一次,发现是硬解码初始化失败了,自动切换到软解码,而在软解码完成首帧解码后,未把该帧的时间戳赋值给时间戳,这样实际上首帧时间戳就为0了,后续视频帧的时间戳与首帧时间戳相隔太大,sleep时间也随之变得很大。

这个bug较难发现,只有某些手机在硬解码出错后,自动切换到软解码的情况下才会出现,但是大多数手机硬解码都能正常工作。

解决问题

找到问题后,解决了这个问题,就可以顺利播放了。

对应的代码修改点在:https://github.com/EasyDarwin/EasyPlayer_Android/commit/3715840f6ce153d319c85da108eab2dac586e372

EasyPlayer RTSP播放器项目

EasyPlayer & EasyPlayerPro是由EasyDarwin团队开发和维护的一个完善的流媒体播放器项目,目前支持Windows(支持多窗口、包含ActiveXnpAPI Web插件)、Android平台,iOS平台,视频支持H.264H.265MPEG4MJPEG,音频支持G711AG711UG726AAC,支持RTSP over TCP/UDP、RTMPHTTPHLS等多种协议,支持硬解码,是一套极佳的流媒体全平台播放组件!

EasyPlayer Android版本经过了很多年的发展和迭代,已经非常稳定、完整,功能包括:直播、录像、抓图、RTP over UDP/TCP,支持指令集包括armv7a、armv8a、x86,应该说是目前市面上功能性、稳定性和完整性最强的一款RTSP播放器!

EasyPlayer RTSP Android播放器项目地址:https://github.com/EasyDarwin/EasyPlayer_Android

BUG修复-EasyPlayer-RTSP卡在首帧的bug修改