基于RTMP协议的流媒体技术的原理与应用
2013-09-20雷霄骅姜秀华王彩虹
雷霄骅,姜秀华,王彩虹
(中国传媒大学信息工程学院,北京100024)
1 引言
近年来,随着网络带宽的提升,以及多媒体压缩编码技术的发展,流媒体技术得到了非常广泛的应用。全球的流媒体市场正在以极高的速度向前发展,并逐步取代了以文本和图片为主的传统互联网。根据Cisco的 Visual Networking Index(VNI)统计,2005年流媒体流量仅占全球互联网总流量的5%,而到了2011年这一比例已经提升到40%,预计到2015年这一比例将会进一步提升到62%。与此同时,流媒体技术也已经突破了电脑的限制,进入了平板电脑和智能手机等领域,一个Video Everywhere的时代即将到来[1]。
在这种流媒体快速发展的大环境下,各个地方的电视台,视频服务提供商纷纷开始了自己的流媒体业务。在搭建业务平台的时候,如何选取合适自己的流媒体平台成为一个至关重要的问题。中国网络电视台,中国教育电视台,河南电视台,深圳电视台等多家电视台,以及六间房,奇异网,威视网等流媒体服务商都选择了Adobe公司的基于Flash平台的流媒体系统。该系统传输数据使用的RTMP协议[2]因此得到了非常广泛的应用。本文将会对其特点进行详细的分析,并搭建一个基于RTMP协议的流媒体直播系统。
2 流媒体
当前互联网中的流媒体服务从传输方式上大体上可以分为两种方式:顺序流式传输和实时流式传输。
2.1 顺序流式传输
顺序流式传输采用普通的HTTP服务器作为存储多媒体文件的服务器。当客户端发起连接想要观看多媒体资源的时候,直接通过HTTP协议把文件下载到客户端本地系统的临时文件夹中,再使用播放器播放已经下载好的文件。它的与服务器交互的流程如图1所示。顺序流式传输的实质就是播放本地文件。顺序流式传输目前得到了十分广泛的应用:YouTube,优酷网,土豆网等视频服务商都采用了该种方式提供多媒体服务。顺序流式传输的好处主要是减轻了服务器的压力,即当多媒体文件下载完成后就可以断开连接,从而节省出服务器资源再为其他客户端服务。此外,顺序流式传输使用的是普通的HTTP服务器,视频服务商不必花费额外的资金购买流媒体服务器,从而节省了一笔经费。
图1 顺序流式传输
2.2 实时流式传输
实时流式传输采用专门的流媒体服务器存储多媒体文件。当客户端发起连接想要观看多媒体资源的时候,一般通过专有的实时流式传输协议把位于流媒体服务器上的多媒体数据直接传输给客户端的播放器,再实时播放。他与服务器交互的流程如图2所示。实时流式传输的应用目前还处于发展阶段,主要应用于网络直播和正版影视的点播。使用实时流式传输方式观看多媒体资源的时候,由于不会把文件下载到本地,可以防止视音频提供商的内容被非法拷贝,从而保护了视音频内容的版权。此外,使用实时流式传输方式观看多媒体资源的时候,可以随意跳转到该视音频的任何位置,而不必像顺序流式传输那样只能观看已经下载过的部分,因此大大增加了观看时的自由度。
图2 实时流式传输
3 实时流式传输
流媒体系统中媒体数据传输需要相应的实时流式传输协议支持。实时流式传输协议属于互联网TCP/IP五层体系结构中应用层的协议。在当前的互联网中,很多实时流式传输协议的标准是公司私有的,因此这些协议规范并不公开。目前公开规范的实时流式传输协议有以下几种:
3.1 RTSP+RTP
RTSP是由 IETF(Internet工程任务组)提出的[3]。RTSP 协议全称是 Real Time Streaming Protocol,即实时流传输协议,是 IETF的 RFC标准。RTSP用于控制流媒体的传输,比如建立连接,播放,暂停等等,但本身并不传输多媒体数据。多媒体数据通常都是使用RTP/RTCP协议进行传输。RTP/RTCP协议全称是Real-time Transport Protocol/Real-time Transport Control Protocol,即实时传送协议/实时传送控制协议,也是IETF的RFC标准,专门用于传输多媒体数据。虽然RTSP+RTP是一个国际标准的组合,但是在互联网世界中却没能做到“一统天下”。这与互联网的环境有很大关系。RTP/RTCP作为传输多媒体数据的网络协议,一般情况下使用 UDP协议作为其传输层的网络协议[3]。UDP是无连接的,不提供可靠交付,因此在互联网上(尤其是广域网)传输数据的时候极易产生丢包,时延,抖动等问题。多媒体数据对丢包,时延,抖动有很高的要求,一点点小问题就会极大的影响用户的体验质量(QoE)[4]。因此互联网上采用RTSP+RTP方式传输的流媒体并不是很多。与在因特网上传输的流媒体不同,IPTV通常都采用RTSP+RTP的方式传输多媒体数据[5]。因为IPTV通常采用专网传输,网络状况较好,极少出现丢包,时延,抖动等问题,而UDP简单的协议规则可以大幅提高传输效率,所以可以“放心大胆”的使用RTSP+RTP的方式传输。
3.2 MMS
MMS是由微软公司提出的。MMS协议全称是Microsoft Media Server protocol,即微软媒体服务协议,用于访问Windows Media发布点上的内容。
3.3 HLS
HLS是由苹果公司提出的。HLS全称是HTTP Live Streaming,即基于HTTP的实时流式传输协议,可实现流媒体的直播和点播,主要应用在iOS系统,为iOS设备(如iPhone、iPad)提供音视频直播和点播方案。
3.4 RTMP
RTMP是由Adobe公司提出的。RTMP协议全称是Real Time Messaging Protocol,即实时消息传送协议,用于在Flash平台之间传递视音频以及数据。与RTSP+RTP组合提供流媒体服务的方式不同,RTMP协议本身既可以传输多媒体数据也可以控制多媒体播放。RTMP协议使用TCP协议作为其传输层的网络协议。TCP是面向连接的[3],提供可靠交付的协议,因此在互联网上传输时不会出现丢包情况,从而保证了用户体验(QoE)。但是TCP协议提供可靠交付的代价就是增加了一些额外的开销,占用了一些带宽和处理机资源。随着网络带宽的提高和计算机硬件的发展,这些开销会显得越来越微不足道。因此RTMP协议在未来有很好的发展前景。
4 基于RTMP的系统的特点
很多网络电视台,流媒体服务提供商之所以会选择RTMP协议作为其提供流媒体服务的应用层协议,在于它有以下几个特点:无须安装客户端程序,保证了媒体传输质量。
4.1 无须安装客户端程序
收看采用RTMP协议提供的流媒体无需安装客户端程序,大大简化了客户操作的复杂度。一般收看流媒体都需要相应的客户端软件的支持,用户需要收看流媒体就必须下载相应的软件(或插件)。而支持RTMP协议的流媒体客户端可以制作成一个普通的Flash文件,只要安装过Flash Player的网页浏览器就可以自动下载该文件并运行它。而Flash Player是一个上网必备的插件。据统计,全世界98% 的网页浏览器都安装了Flash Player。因此,普通用户不需要任何操作,只要使用网页浏览器打开播放页面,就可以收看流媒体[6]。
4.2 保证了媒体传输质量
RTMP协议有效的保证了媒体传输质量,使用户可以观看到高质量的多媒体。RTMP采用TCP协议作为其在传输层的协议,避免了多媒体数据在广域网传输过程中的丢包对质量造成的损失。此外RTMP协议传输的FLV封装格式支持的H.264视频编码方式可以在很低的码率下显示质量还不错的画面,非常适合网络带宽不足的情况下收看流媒体。
5 RTMP的规范
5.1 协议格式[2][7]
RTMP协议是一个互联网TCP/IP五层体系结构中应用层的协议。RTMP协议中基本的数据单元称为消息(Message)。当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。
5.1.1 消息
消息是RTMP协议中基本的数据单元。不同种类的消息包含不同的Message Type ID,代表不同的功能。RTMP协议中一共规定了十多种消息类型,分别发挥着不同的作用。例如,Message Type ID在1-7的消息用于协议控制,这些消息一般是RTMP协议自身管理要使用的消息,用户一般情况下无需操作其中的数据。Message Type ID为8,9的消息分别用于传输音频和视频数据。Message Type ID为15-20的消息用于发送AMF编码[8]的命令,负责用户与服务器之间的交互,比如播放,暂停等等。消息首部(Message Header)有四部分组成:标志消息类型的Message Type ID,标志消息长度的Payload Length,标识时间戳的Timestamp,标识消息所属媒体流的Stream ID。消息的报文结构如图3所示。
图3 消息
5.1.2 消息块
图4 消息块
5.1.3 消息分块
在消息被分割成几个消息块的过程中,消息负载部分(Message Body)被分割成大小固定的数据块(默认是128字节,最后一个数据块可以小于该固定长度),并在其首部加上消息块首部(Chunk Header),就组成了相应的消息块。消息分块过程如图5所示,一个大小为307字节的消息被分割成128字节的消息块(除了最后一个)。
图5 RTMP分块
RTMP传输媒体数据的过程中,发送端首先把媒体数据封装成消息,然后把消息分割成消息块,最后将分割后的消息块通过TCP协议发送出去。接收端在通过TCP协议收到数据后,首先把消息块重新组合成消息,然后通过对消息进行解封装处理就可以恢复出媒体数据。
5.2 连接方式[9]
RTMP协议规定,发布一个媒体流之前需要创建两个逻辑结构:第一步,建立一个网络连接(Net-Connection);第二步,基于该网络连接建立一个网络流(NetStream)。其中,网络连接代表服务器端和客户端之间基础的联系;网络流代表了发送多媒体数据的通道。服务器和客户端之间只能建立一个网络连接,但是基于该连接可以创建很多网络流。他们的关系如图6所示:
图6 RTMP的网络连接和网络流
6 基于RTMP的直播系统的搭建[9]
6.1 系统结构
本文将会实现一个基于RTMP协议的流媒体直播系统。一个完整的流媒体直播系统包括以下几个部分:视频源,流媒体服务器和客户端,系统的构成如图7所示。视频源将视频数据经过RTMP协议发布到流媒体服务器上;视频成功发布以后,客户端通过RTMP连接到流媒体服务器,就可以播放相应的视频。其中,视频源和客户端都是使用ActionScript语言编写的Flash程序[10],流媒体服务器使用Adobe公司的Flash Media Server软件。
图7 系统构成图
6.2 视频源
视频源是一个提供视频流的应用程序。本系统中使用一个ActionScript代码编写的Flash程序作为视频源。该程序采集本机摄像头数据,将数据压缩编码后使用RTMP协议将数据发布到流媒体服务器相应的应用程序(Application)上面。
下面简要介绍一下视频源部分重要代码含义:
//建立一个RTMP网络连接
柯青,2017年毕业于南京师范大学,长期研究文学以及中国哲学伦理方向。著有散文书籍《浓墨重彩》。现为上海潘言教育科技有限公司创始人。
var nc:NetConnection=new NetConnection();
//连接到IP为222.31.64.249的流媒体服务器上名字为publishlive的应用程序
nc.connect("rtmp://222.31.64.249/publishlive");
//建立一个基于该连接的网络流
ns=new NetStream(nc);
//调用本机的摄像头
cam=Camera.getCamera();
//把摄像头添加到新建的流上
ns.attachCamera(cam);
//把一个多媒体流发布到服务器的应用程序上,取名为“myCamera”
ns.publish("myCamera","live");
6.3 流媒体服务器
流媒体服务器是存储(或接收)媒体流并且等待客户端连接的软件。本系统采用Adobe公司的Flash Media Server作为流媒体服务器。媒体流必需发布到已经在流媒体服务器上注册过的应用程序上。在Flash Media Server的安装目录的“Application”文件夹下新建一个“publishlive”文件夹,即可注册一个名为“publishlive”的应用程序,不需要编写任何代码。
6.4 客户端
客户端是播放视频流的应用程序。本系统采用一个ActionScript语言编写的Flash程序作为播放实时流的客户端。使用RTMP协议从流媒体服务器获得视频数据并显示播放。
下面简要介绍一下客户端的部分关键代码的含义:
//建立一个RTMP网络连接
var nc:NetConnection=new NetConnection();
//连接到IP为222.31.64.249的流媒体服务器上名字为publishlive的应用程序
nc.connect("rtmp://222.31.64.249/publishlive");
//建立一个基于该连接的多媒体流
nsPlayer=new NetStream(nc);
//播放名为“myCamera”的多媒体流
nsPlayer.play("myCamera");
//新建一个Video对象用于显示视频
vidPlayer = new Video(cam.width,cam.height);
//将多媒体流添加到Video类上
vidPlayer.attachNetStream(nsPlayer);
//在Flash舞台上显示Video对象
addChild(vidPlayer);
7 小结和展望
本文分析了流媒体的两种基本传输方式:顺序流式传输和实时流式传输的区别。并重点分析了几种主要的实时流式传输协议的特点。以RTMP协议为基础,分析了它的特点和格式,最后实现了一个的基于RTMP协议的流媒体直播系统。对于全面了解RTMP协议的原理有很大的帮助,同时可以为设计与实现更为复杂的基于RTMP协议的流媒体系统提供一个参考。
今年以来,随着互联网电视(Over-The-Top TV)逐渐兴起,流媒体技术将会随之迎来一个大发展阶段。可以预见,以流媒体技术为支撑的流媒体在未来将会占据传统电视的部分市场并获得相当数量的客户群。而不需要用户安装客户端,视音频质量良好的基于RTMP协议的流媒体系统,也将会在众多流媒体系统中凸现出来,获得很大的市场份额。
[1]中广研究,视讯天下.在线视频平台白皮书[C].北京:中国标准出版社,2012.
[2]Adobe Systems Incorporated.RTMP Specification[EB/OL].http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf,2009.
[3]谢希仁.计算机网络(第五版)[M].北京:电子工业出版社,2009.
[4]苏佳,姜秀华.IPTV 视频质量评价介绍[J].电视技术,2011,35(6):78-81.
[5]万晓榆,张洪,欧阳春,张溢华.IPTV技术与运营[M].北京:科学出版社,2010.
[6]林晓伟 .Flash Player内部机制[EB/OL].http://wenku.baidu.com/view/d4243af3f90f76c66 1371af4.html,2010.
[7]姜浩然,徐林.基于RTMP的流媒体服务器的研究[J].计算机与数字工程,2011,39(10):104-108.
[8]Adobe Systems Incorporated.AMF 3 Specification[EB/OL].http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/amf/pdf/amf-file-format-spec.pdf,2006.
[9]Adobe Systems Incorporated.Adobe Flash Media Server 4.5 Developer's Guide [EB/OL].http://help.adobe. com/en _ US/flashmediaserver/devguide/flashmediaserver_4.5_dev_guide.pdf,2012.
[10]Zerlot Ma.Flash Media Server 3.0技术指南Part1[EB/OL].http://wenku.baidu.com/view/ab293b48c850ad02de80418f.html,2006.