转自:
http://blog.csdn.net/baby313/article/details/7353605 本文会带领着你一步步动手实现一个简单的RTP传输服务器,旨在了解RTP流媒体传输协议以及一些关于多媒体编解码的知识。 关于RTP协议的必备知识要动手实现一个协议,当然首先需要阅读该协议的文档。RTP协议的文档,有rfc1889、rfc1890、rfc3550,其中rfc3550是现在的版本,另外两个是过期版。这个协议可以在ietf的官网找到:http://tools./html/rfc3550RTP packetRTP是基于UDP协议的,RTP服务器会通过UDP协议,通常每次会发送一个RTP packet。客户端通过解析RTP packet,读取其中的数据然后进行播放了。RTP packet的结构如下:
RTP Header这是RTP流的头部,在网上搜索RTP格式,就会搜到很多文章介绍这个头部的定义。我们这里参考rfc3550的定义,在5.1节(http://tools./html/rfc3550#section-5.1)。 0 1 2 3 每行是32 bits,由此可以直观看到每个表示部分所占的位数。简单介绍一下: V(version):2 bits,RTP的版本,这里统一为2 P(padding):1 bit,如果置1,在packet的末尾被填充,填充有时是方便一些针对固定长度的算法的封装 X(extension):1 bit,如果置1,在RTP Header会跟着一个header extension CC(CSRC count): 4 bits,表示头部后contributing sources的个数 M(marker): 1 bit,具体这位的定义会在一个profile里 PT(playload type): 7 bits,表示所传输的多媒体的类型,对应的编号在另一份文档rfc3551中有列出(http://tools./html/rfc3551) sequence number: 16 bits,每个RTP packet的sequence number会自动加一,以便接收端检测丢包情况 timestamp: 32 bits,时间戳 SSRC: 32 bits,同步源的id,没两个同步源的id不能相同 CSRC: 上文说到,个数由CC指定,范围是0-15 以上的一些概念是一些要实现RTP服务器所必备的知识。介绍的非常简略,详细的定义还是要参考rfc3550原文。 动手实践我们既然已经知道了RTP packet的结构,那么我们以前用到的RTP流是否也是这样的结构呢?如何验证呢?接下来,我们就一步步验证RTP流的结构。 我们知道RTP是基于UDP协议的,那么我们就先做一个简单的UDP接受端,看看我们可以从RTP服务器接受到什么信息。要实现这个接受端,你需要有一定的网络编程经验,至于具体到操作系统、编程环境、开发语言等都不限制。为了简单,我这里用python给出一个小小的例子程序。
这就是接受程序啦,非常短小,而且有简单注释,这里就不解释了。 接受端已经做好了,那么去哪里找RTP服务器作发送端呢?你可以用一些搭建流媒体服务器的工具,我这里选用的是强大的VLC。关于VLC搭建流媒体服务器的方法,请参考我前面的文章基于移动平台的多媒体框架——用VLC搭建简单的流媒体服务器。这里需要注意几个配置的地方,一是选择Destination的时候要选择RTP而不要选择RTSP,然后地址可以填写本机ip地址或直接写localhost,端口号填写的要和接受端一致,这里是6666。配置好之后的string应该类似于: :sout=#rtp{dst=localhost,port=6666,mux=ts} :no-sout-rtp-sap :no-sout-standard-sap :ttl=1 服务端配置完成之后,开始Stream。这时打开接受端,就会接受到一些数据,我接收到的数据开头是: 80 a1 20 43 8c cf 76 3c 93 59 d 74 47 0 44 10 V(version)=2 P(padding)=0 X(extension)=0 CC(CSRC count)=0 第二个byte a1 表示: M(marker)=1 PT(playload type)=33(对照rfc3551可以发现,33表示MP2T AV,正是我们用VLC Stream的格式类型) 后面的2bytes的sequence number我们可以直观的看出是在加一,4bytes的timestamp也是在不断递增的。再之后的93 59 d 74就是SSRC id了,由于CC为0,所以没有CCRC。再之后的几位都是RTP所要传输的数据了。 总结对RTP协议的熟悉是实现它的基础。这里我只是做一个简单的介绍,需要详细了解,读官方的文档是必不可少的步骤。 通过写一个小程序打印出RTP流中具体的数据,并没有对实现RTP服务器有直接帮助。但是可以让你对协议本身以及编程环境更加熟悉,也方便了以后实现过程中进行调试。不论你在什么环境用什么语言实现,都强烈建议写一个这样的小程序。 |
|