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

Android 查看RTC时间 安卓 rtsp_RTSP播放器

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

  • 没有接收到视频帧;
  • 解码器出错,只解出了第一帧图像;
  • 时间戳计算有误,导致长时间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