众所周知,RTMP是以flash为客户端播放器的直播协议,主要应用在B/S形式的场景中。本人研究并用C++开发实现了RTMP直播流协议的播放器,结合以前作的RTMP直播采集端,能够将RTMP协议彻底扩展到C/S形式的应用场景中,这将对以后的通用、全平台的流媒体架构设计和实现,打下坚实的基础。html
RTMP直播协议,是Adobe公司推出的以flash播放器为客户端的实时直播流协议,是一种应用很是普遍的通讯协议。而flash直播,也是到目前为止,web页面上最成熟的直播技术。不过,由于flash主要是嵌入到web页面中,所以,RTMP直播,一般也就局限在B/S形式的直播应用。web
我以前陆续作了不少与RTMP直播协议相关的项目开发,都是采集发布端的,数据发往FMS等rtmp服务器以后,最终是经过flash来收看的。并非考虑flash自己好或很差的问题,而是想把这个BS的技术直播协议,不借助Adobe Air平台,扩展到C/S场景中,这样,用户不只能够在网页上收看RTMP协议的直播流,还能够经过客户端来收看,大大丰富了直播协议的灵活度。另外,实现了这一点,为RTMP直播协议的跨平台,以及跨移动平台(Android, iOS)的应用,也提供了可能。有很好的前景。服务器
好比,经过实现不一样平台上的rtmp播放器,来实现以下架构。架构
其实,实现RTMP直播流播放器,逻辑上和实现其余直播流协议播放器,是一致的,总体上程序能够分为三个部分框架
实现的模块,以及主要流程,以下图所示函数
目前为止,这个设计是为Windows PC端开发所作,未来会作进一步移植,这个状况下,主要是修改视频渲染和音频播放的实现。架构设计
RtmpDownloader模块很是重要,我这里是将librtmp做为底层的rtmp传输协议。在librtmp之上,除了接口调用,还须要进行数据包的解析,h.264视频数据和aac音频数据的分离,以及从中解析出重要的解码信息,交给解码器解码,并初始化渲染器。整个的框架和流程以下图设计
RtmpPlayer四个接口所表明的意义下面列了出来。这就是RTMP下载最须要获取到的数据,以及解码信息。3d
说到视频渲染,这彷佛是个坑,相信作播放器开发的朋友会有说不完的话,不过我在这里就简单贴下个人主要渲染流程。Windows上视频渲染能够选择的方式有不少,好比Direct3D、DirectDraw、GDI,OpenGL等,这里选择d3d的方式来渲染。视频
音频播放能够选择WAVE系列函数,或者DirectSound的接口等,这里我选择使用WAVE接口,缘由固然是比较简单啦 :)
播放一下从网上找到的深圳卫视rtmp直播流地址,画面清晰,音视频同步,效果还不错 :)
配合以前作的RTMP采集推送端,能够彻底脱离flash来实现基于RTMP协议的直播。
from:http://www.cnblogs.com/haibindev/p/3466094.html