自己写RTPserver——大约RTP协议
自己写RTPserver——大约RTP协议
本文将带领你一步一步地实现一个简单的手RTP变速器server,旨在了解RTP流媒体传输协议以及有关多媒体编解码器的一些知识。
RTP协议的必备知识
要动手实现一个协议,当然首先须要阅读该协议的文档。
RTP协议的文档,有rfc1889、rfc1890、rfc3550。当中rfc3550是如今的版本号,另外两个是过期版。这个协议能够在ietf的官网找到:http://tools.ietf.org/html/rfc3550
RTP packet
RTP是基于UDP协议的。RTPserver会通过UDP协议,通常每次会发送一个RTP packet。
client通过解析RTP packet,读取当中的数据然后进行播放了。
RTP packet的结构例如以下:
- RTP Header:RTP 包的头部
- contributing sources:个数为0-n个。所以能够为空。详细定义參考rfc3550
- 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
以上的一些概念是一些要实现RTPserver所必备的知识。介绍的很简略,具体的定义还是要參考rfc3550原文。
动手实践
我们既然已经知道了RTP packet的结构,那么我们曾经用到的RTP流是否也是这种结构呢?怎样验证呢?接下来。我们就一步步验证RTP流的结构。
我们知道RTP是基于UDP协议的,那么我们就先做一个简单的UDP接受端,看看我们能够从RTPserver接受到什么信息。
要实现这个接受端。你须要有一定的网络编程经验,至于详细到操作系统、编程环境、开发语言等都不限制。为了简单,我这里用python给出一个小小的样例程序。
import socket # Build a socket to receive data from RTP server.
# Here we use SOCK_DGRAM, because RTP is on UDP.
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("localhost", 6666)) for i in range(5):
# We just get 16 bytes to analyze the RTP Header.
buf = sock.recv(16) # Output the result in octal.
for c in buf:
print "%x" % ord(c),
print sock.close()
这就是接受程序啦,很短小,并且有简单凝视,这里就不解释了。
接受端已经做好了。那么去哪里找RTPserver作发送端呢?你能够用一些搭建流媒体server的工具。我这里选用的是强大的VLC。关于VLC搭建流媒体server的方法,请參考我前面的文章基于移动平台的多媒体框架——用VLC搭建简单的流媒体server。这里须要注意几个配置的地方。一是选择Destination的时候要选择RTP而不要选择RTSP,然后地址能够填写本机ip地址或直接写localhost,port号填写的要和接受端一致,这里是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详细数据流,并没有意识到RTPserver直接的帮助。但协议本身可以让你变得更熟悉和编程环境,也便于调试后,执行过程。不管你意识到什么环境什么语言,强烈建议写一个小程序,。
自己写RTPserver——大约RTP协议的更多相关文章
- 自己动手写RTP服务器——关于RTP协议
转自:http://blog.csdn.net/baby313/article/details/7353605 本文会带领着你一步步动手实现一个简单的RTP传输服务器,旨在了解RTP流媒体传输协议以及 ...
- 自己动手写RTP服务器——用RTP协议传输TS流
上一篇文章我们介绍了关于RTP协议的知识,那么我们现在就自己写一个简单的传输TS流媒体的RTP服务器吧. 预备知识 关于TS流的格式:TS流封装的具体格式请参考文档ISO/IEC 13818-1.这里 ...
- RTP 协议
转载http://www.cnblogs.com/qingquan/archive/2011/07/28/2120440.html 概述: 实时传送协议(Real-time Transport Pro ...
- RTP协议全解析(H264码流和PS流)
转自:http://blog.csdn.net/chen495810242/article/details/39207305 写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个 ...
- (转)RTP协议全解(H264码流和PS流)
写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢. 互联网的发展离不开大家的无私奉献,我决定从我做起,希 ...
- RTP协议全解(H264码流和PS流)
写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢. 互联网的发展离不开大家的无私奉献,我决定从我做起,希 ...
- RTP协议分析和详解
一.RTP协议分析 第1章. RTP概述 1.1. RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议).它是IETF提出的一个标准,对应的RF ...
- 闲来无事,写个基于UDP协议的Socket通讯Demo
项目一期已经做完,二期需求还没定稿,所以最近比较闲. 上一篇写的是TCP协议,今天写一下UDP协议.TCP是有连接协议,所以发送和接收消息前客户端和服务端需要建立连接:UDP是无连接协议,所以发送消息 ...
- Rtp 协议实现网络广播台网络收音机
RTP协议介绍:http://www.360doc.com/content/11/1009/15/496343_154624612.shtml 本文中使用了 StreamCoders 的 RTP.ne ...
随机推荐
- 有趣html5(两)----使用canvas结合剧本画在画布上的简单图(html5另一个强大)
请珍惜劳动小编成果,这篇文章是原来小编,转载请注明出处. 于html5中能够使用canvas标签在画布上绘图,先直接上代码,这篇文章先简介一下canvas的用法.简单画几个圆,矩形,三角形,写字. 在 ...
- hexo 部署至Git遇到的坑
查找资料的时候发现了next这个博客主题,next!非常的漂亮,顺手查看了hexo的相关部署. Hexo官方介绍 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲 ...
- C#动态调用WCF接口
C#动态调用WCF接口 写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项 ...
- 每天收获一点点------Hadoop之HDFS基础入门
一.HDFS出现的背景 随着社会的进步,需要处理数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是却不方便管理和维护—>因此,迫切需要一种系统来管理多 ...
- 新秀发挥云17号:RHEL改变以太网地址克隆虚拟机后,
新秀发挥云17号:RHEL改变以太网地址克隆虚拟机后, (一)变化hostname # vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=your-v ...
- Node.js新手教程——怎样实现文件上传功能
作者:zhanhailiang 日期:2014-11-16 本文将介绍怎样使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/node ...
- [cocos2dx注意事项009]试用quick-cocos2dx-2.2.4
quick-cocos2d-x 在中国站http://quick.cocoachina.com/?page_id=40,用他们自己的话说:quick-cocos2d-x(后文简称 quick)与 co ...
- 学习日记之单例模式和Effective C++
单例模式(Singleton):保证一个类仅有一个实例,并提供一个訪问它的全局訪问点. (1),通常我们能够让一个全局变量使得一个对象被訪问,但它不能防止你实例化多个对象.一个最好的办法就是,让类自身 ...
- 使用pfile 启动oracle 实例时,启动失败---db_recovery_file_dest參数值在os上不存在。
[oracle@vm22 ~]$ export ORACLE_SID=orcl [oracle@vm22 ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2. ...
- ftp server来源分析20140602
ftp server学习位和源代码分析片 记录自己的第一个开源的分析过程: 从源代码:野狐灯(我接下来的几篇文章是从源头:野狐灯,每个以下哪项不是他们设置.) 20140602 Ftp的源码目录例如 ...