Bootstrap

如何设计一款跨平台低延迟的RTMP|RTSP直播播放器

​开发背景

2015年,当我们试图在市面上找一款专供直播播放使用的低延迟播放器,来配合测试我们的RTMP推送模块使用时,居然发现没有一款好用的,市面上的,如VLC或Vitamio,说白了都是基于FFMPEG,在点播这块支持格式很多,也非常优异,但是直播这块,特别是RTMP,延迟要几秒钟,对如纯音频、纯视频播放,快速启播、网络异常状态处理、集成复杂度等各方面,支持非常差,而且因为功能强大,bug很多,除了行业内资深的开发者能驾驭,好多开发者甚至连编译整体环境,都要耗费很大的精力。

我们的直播播放器,始于Windows平台,Android和iOS同步开发,基于上述开源播放器的各种缺点,我们考虑全自研框架,确保整体设计跨平台,再保障播放流程度的前提下,尽可能的做到毫秒级延迟,接口设计三个平台统一化,确保多平台集成复杂度降到最低。

整体方案架构RTMP或RTSP直播播放器,目标很明确,从RTMP服务器(自建服务器或CDN)或RTSP服务器(或NVR/IPC/编码器等)拉取流数据,完成数据解析、解码、音视频数据同步、绘制。

具体对应下图“接收端”部分:

初期模块设计目标
  • 自有框架,易于扩展,自适应算法让延迟更低、解码绘制效率更高;

  • 支持各种异常网络状态处理,如断网重连、网络抖动等控制;

  • 有Event状态回调,确保开发者可以了解到播放端整体的状态,从纯黑盒不可控,到更智能的了解到整体播放状态;

  • 支持多实例播放;

  • 视频支持H.264,音频支持AAC/PCMA/PCMU;

  • 支持缓冲时间设置(buffer time);

  • 实时静音。

经过迭代后的功能
  • [支持播放协议]RTSP、RTMP;

  •  [多实例播放]支持多实例播放;

  •  [事件回调]支持网络状态、buffer状态等回调;

  •  [视频格式]支持RTMP扩展H.265,H.264;

  •  [音频格式]支持AAC/PCMA/PCMU/Speex;

  •  [H.264/H.265软解码]支持H.264/H.265软解;

  •  [H.264硬解码]Windows/Android/iOS支持H.264硬解;

  •  [H.265硬解]Windows/Android/iOS支持H.265硬解;

  •  [H.264/H.265硬解码]Android支持设置Surface模式硬解和普通模式硬解码;

  •  [缓冲时间设置]支持buffer time设置;

  •  [首屏秒开]支持首屏秒开模式;

  •  [低延迟模式]支持类似于线上娃娃机等直播方案的超低延迟模式设置(公网200~400ms);

  •  [复杂网络处理]支持断网重连等各种网络环境自动适配;

  •  [快速切换URL]支持播放过程中,快速切换其他URL,内容切换更快;

  •  [音视频多种render机制]Android平台,视频:surfaceview/OpenGL ES,音频:AudioTrack/OpenSL ES;

  •  [实时静音]支持播放过程中,实时静音/取消静音;

  •  [实时快照]支持播放过程中截取当前播放画面;

  •  [只播关键帧]Windows平台支持实时设置是否只播放关键帧;

  •  [渲染角度]支持0°,90°,180°和270°四个视频画面渲染角度设置;

  •  [渲染镜像]支持水平反转、垂直反转模式设置;

  •  [实时下载速度更新]支持当前下载速度实时回调(支持设置回调时间间隔);

  •  [解码前视频数据回调]支持H.264/H.265数据回调;

  •  [解码后视频数据回调]支持解码后YUV/RGB数据回调;

  •  [解码后视频数据缩放回调]Windows平台支持指定回调图像大小的接口(可以对原视图像缩放后再回调到上层);

  •  [解码前音频数据回调]支持AAC/PCMA/PCMU/SPEEX数据回调;

  •  [音视频自适应]支持播放过程中,音视频信息改变后自适应;

  •  [扩展录像功能]支持RTSP/RTMP H.264、扩展H.265流录制,支持PCMA/PCMU/Speex转AAC后录制,支持设置只录制音频或视频等;

RTMP、RTSP直播播放开发设计考虑的点

总结

总的来说,无论是基于开源播放器二次开发,还是全自研,一个好的RTMP播放器或RTSP播放器,设计的时候,更多考虑的应该是如何做的更灵活、稳定,单纯的几个接口,很难满足通用化的产品诉求。

以下共勉:厚积薄发,登上山顶,不是为了饱览风光,是为了寻找更高的山峰!