如何设计一款跨平台低延迟的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播放器,设计的时候,更多考虑的应该是如何做的更灵活、稳定,单纯的几个接口,很难满足通用化的产品诉求。
以下共勉:厚积薄发,登上山顶,不是为了饱览风光,是为了寻找更高的山峰!