本文会带领着你一步步动手实现一个简单的RTP传输服务器,旨在了解RTP流媒体传输协议以及一些关于多媒体编解码的知识。

关于RTP协议的必备知识

要动手实现一个协议,当然首先需要阅读该协议的文档。RTP协议的文档,有rfc1889、rfc1890、rfc3550,其中rfc3550是现在的版本,另外两个是过期版。这个协议可以在ietf的官网找到:http://tools.ietf.org/html/rfc3550

RTP packet

RTP是基于UDP协议的,RTP服务器会通过UDP协议,通常每次会发送一个RTP packet。客户端通过解析RTP packet,读取其中的数据然后进行播放了。

RTP packet的结构如下:

  1. RTP Header:RTP 包的头部
  2. contributing sources:个数为0-n个,所以可以为空。具体定义参考rfc3550
  3. RTP payload:即RTP要传输的数据

RTP Header

这是RTP流的头部,在网上搜索RTP格式,就会搜到很多文章介绍这个头部的定义。我们这里参考rfc3550的定义,在5.1节(http://tools.ietf.org/html/rfc3550#section-5.1)。

0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V=2|P|X|  CC   |M|     PT      |       sequence number         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           timestamp                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           synchronization source (SSRC) identifier            |
   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
   |            contributing source (CSRC) identifiers             |
   |                             ....                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

每行是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.ietf.org/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给出一个小小的例子程序。

[python] view plaincopy
  1. import socket
  2. # Build a socket to receive data from RTP server.
  3. # Here we use SOCK_DGRAM, because RTP is on UDP.
  4. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  5. sock.bind(("localhost", 6666))
  6. for i in range(5):
  7. # We just get 16 bytes to analyze the RTP Header.
  8. buf = sock.recv(16)
  9. # Output the result in octal.
  10. for c in buf:
  11. print "%x" % ord(c),
  12. print
  13. sock.close()

这就是接受程序啦,非常短小,而且有简单注释,这里就不解释了。

接受端已经做好了,那么去哪里找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
80 a1 20 44 8c cf 79 4b 93 59 d 74 47 40 42 36
80 a1 20 45 8c cf 7d 36 93 59 d 74 47 0 44 1a
80 a1 20 46 8c cf 81 21 93 59 d 74 47 40 45 1a
80 a1 20 47 8c cf 85 c 93 59 d 74 47 0 45 1b
这是十六进制的表示。我们依照上面的Header的格式对其进行解读:
第一个byte 80 表示:

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服务器有直接帮助。但是可以让你对协议本身以及编程环境更加熟悉,也方便了以后实现过程中进行调试。不论你在什么环境用什么语言实现,都强烈建议写一个这样的小程序。

自己动手写RTP服务器——关于RTP协议相关推荐

  1. 自己动手写web服务器一(浏览器的访问信息)

    要协议一个web服务器,需要了解http协议,下面我们来看一下当浏览器请求网张的时候向web服务器发送的数据,我使用的是ubuntu 中telent展现一个下过程.我需要一个简单的网站来演示一下,我装 ...

  2. WebRTC服务器理论铺垫(六):OpenSSL协议,DTLS协议,RTP协议和SRTP协议

    文章目录 一.SSL协议 二.OpenSSL 三.TLS和DTLS 四.DTLS的通信的步骤图 五.RTP协议和SRTP协议 5.1 详解RTP协议 5.2 详解RTCP协议 5.3 RTP & ...

  3. RTP协议介绍以及C语言实现具有发送H.264视频功能的RTP服务器

    RTP封装H.264视频规范以及C语言实现 以前上学时间做嵌入式开发板Hi3516A的流媒体项目,现在又突然想起来,不想学过就忘了浪费了,所以又自己实现了一遍读取本地视频文件发送RTP视频流的程序,算 ...

  4. 深入学习Tomcat----自己动手写服务器(附服务器源码)

    相信大多Web开发者对Tomcat是非常熟悉的,众所周知Tomcat是一款非常好用的开源Servlet容器,您一定对这个最流行的Servlet容器充满好奇,虽然它并不像一个黑盒子那样让人无法触摸但是T ...

  5. RTP(实时传输协议)

    目录 1概述 2 RTP使用场景 3 RTP详解 4 RTP控制协议RTCP 1概述 RTP(real-time transport protocol),实时传输协议.RTP在多点传送(多播)或单点传 ...

  6. 为什么魔兽世界不显示服务器,魔兽世界为什么看不见自己的同伴呢_在rtp服务器取消位面...

    魔兽世界为什么看不见自己的同伴?魔兽世界在rtp服务器取消位面介绍,魔兽世界官方在今天宣布,游戏中的位面技术已经在RP服务器中取消,原因是该技术在社区中受到了大量玩家的抗议,下面就跟着小编来看看具体情 ...

  7. c语言rtp协议,RTP系列:RTP协议详解和分析

    1.RTP概述 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,作为因特网标准在RFC 3550(该文档的旧版本是RFC 1889)有详细说明. ...

  8. 利用html 5 websocket做个山寨版web聊天室(手写C#服务器)

    在之前的博客中提到过看到html5 的websocket后很感兴趣,终于可以摆脱长轮询(websocket之前的实现方式可以看看Developer Works上的一篇文章,有简单提到,同时也说了web ...

  9. 自己动手写H3C校园网登录客户端(Linux平台版)

    自己动手写H3C校园网登录客户端(Linux平台版) By 马冬亮(凝霜  Loki) 一个人的战争(http://blog.csdn.net/MDL13412) 周一晚上的时候,和实验室的ZL同学提 ...

最新文章

  1. python爬虫常见反爬措施_爬虫常见的反爬措施有哪些
  2. Git 初学札记(十)—— Reset 回退的三种状态解析
  3. 计算机组成与体系结构——计算机结构——2020.11.19
  4. 机器学习中的数据预处理方法与步骤
  5. JTAG接口针脚定义及含义
  6. 《软件测试》[(美)Ron Patton]第三章阅读总结
  7. java pdf 加图片_java实现在pdf模板的指定位置插入图片
  8. 佳佳mpg格式转换器免费版 v12.4.0.0
  9. Python金融系列第六篇:现代投资组合理论
  10. C语言实验——拍皮球 1184
  11. 十五章、KPI(千峰网络安全300课时笔记)
  12. NR5G基础概念扫盲
  13. 车灯线光源的优化设计matlab,车灯线光源的优化设计
  14. GOPATH 与工作空间
  15. 解密你为何成不了富人
  16. 爬取财经新闻+新闻评论(一网打尽)
  17. 关于软件和软件工程师
  18. 苹果8参数_苹果Apple MacBook Air 13.3 新款笔记本怎么样,配置好不好
  19. 华为u8860 V100R001CHNC00B919版本 FM消失了
  20. python实现递归二叉树排序

热门文章

  1. 用电脑发短信_重磅!一个软件实现电脑上接打手机电话、收发短信、传文件、屏幕镜像!...
  2. cookie、 sessionStorage 、localStorage之间的区别和使用
  3. python3 pillow使用测试
  4. watch netstat
  5. 第一次经历黑客攻击服务器系统
  6. Web服务cxf框架发布2
  7. c# webrequest 自动登入网站
  8. 上周热点回顾(7.1-7.7)
  9. python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>
  10. 【H5】解决ios禁止缩放失效的方法