转 RTSP客户端模拟器(TCP方式,Python实现)
转自: http://www.cnblogs.com/MikeZhang/archive/2012/10/29/rtspTcpClient_DSS_20121029.html
由于某种需求,工作中需要自己要开发RTSP客户端模拟器……这里以DarwinStreamingServer(简称DSS)为例进行演示,把思路记录下来,算是开发了一个测试工具,也方便我以后查阅。在我之前的文章(http://www.cnblogs.com/MikeZhang/archive/2012/09/16/RTSPoverTCPUDP20120916.html )中介绍过怎样通过TCP的方式来访问DSS,在那个实例中,我用的是VLC作为客户端,通过命令行参数进行调用的。
一、通信端口分析
首先通过抓包分析确定数据通信端口。
RTSP数据包截图:

RTP数据包截图:

RTCP数据包截图:

由图可知,在以TCP方式访问DSS时,RTSP数据、RTP数据和RTCP数据都是通过554端口进行传输的,所以DSS服务器只通过554端口和客户端通信。
二、通信过程分析

OPTIONS :查询到服务器所提供的方法;
DESCRIBE :得到会话描述信息(SDP);
SETUP :提醒服务器建立会话,并确定传输模式;
PLAY :客户端发送播放请求;
TEARDOWN :客户端发起关闭请求;
当然中间还有RTP和RTCP的交互,这里就不叙述了。
三、模拟器实现
1、建立链接
1 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
2 s.connect((m_Vars["defaultServerIp"],m_Vars["defaultServerPort"]))
2、查询服务器所提供的方法
向服务器发送OPTIONS请求,得到服务器所提供的方法。
1 s.send(genmsg_OPTIONS(m_Vars["defaultTestUrl"],seq,m_Vars["defaultUserAgent"]))
2 print s.recv(m_Vars["bufLen"])
3、得到会话描述信息
向服务器发送DESCRIBE请求,得到SDP
1 s.send(genmsg_DESCRIBE(m_Vars["defaultTestUrl"],seq,m_Vars["defaultUserAgent"]))
2 msg1 = s.recv(m_Vars["bufLen"])
3 print msg1
4、提醒服务器建立会话,并确定传输模式
向服务器发送SETUP请求,通知服务器产生session,并和服务器确定传输模式等。

1 s.send(genmsg_SETUP(m_Vars["defaultTestUrl"] + "/trackID=3",seq,m_Vars["defaultUserAgent"]))
2 msg1 = s.recv(m_Vars["bufLen"])
3 print msg1
4 seq = seq + 1
5
6 sessionId = decodeMsg(msg1)['Session']
7
8 s.send(genmsg_SETUP2(m_Vars["defaultTestUrl"] + "/trackID=4",seq,m_Vars["defaultUserAgent"],sessionId))
9 msg1 = s.recv(m_Vars["bufLen"])
10 print msg1

5、客户端发起播放请求
向服务器发送PLAY请求,通知服务器发送RTP数据。
1 s.send(genmsg_PLAY(m_Vars["defaultTestUrl"] + "/",seq,m_Vars["defaultUserAgent"],sessionId))
2 msg1 = s.recv(m_Vars["bufLen"])
3 print msg1
客户端接收RTP数据
1 while True :
2 msgRcv = s.recv(m_Vars["bufLen"])
3 if 0 == len(msgRcv) : break
4 print len(msgRcv)
6、客户端发起关闭请求
客户端向服务器发送TREADOWN请求,通知服务器关闭。
1 s.send(genmsg_TEARDOWN(m_Vars["defaultTestUrl"] + "/",seq,m_Vars["defaultUserAgent"],sessionId))
2 msg1 = s.recv(m_Vars["bufLen"])
3 print msg1
完整代码:https://gist.github.com/3974202
四、运行效果

转 RTSP客户端模拟器(TCP方式,Python实现)的更多相关文章
- ffmpeg强制使用TCP方式读取rtsp流
ffmpeg强制使用TCP方式处理rtsp流,参考网上资料,得知可以使用如下命令: “ffmpeg -rtsp_transport tcp -i rtsp://admin.......” 可以是使用抓 ...
- 用vlc搭建简单流媒体服务器(UDP和TCP方式)
.UDP(legacy)传统模式 .RTP方式 .RTSP方式 RTSP方式是通过RTP进行流媒体数据的传输的,VLC的实现也是基于UDP的.这种方式网上的参考资料比较多,我就不截图了,直接叙述命令行 ...
- WCF的Restful和TCP方式调用性能比较
1. 实验背景关于WCF提供分布式访问服务,最常用的两种方式Restful方式和Tcp方式,在本地测试了一把.结果显示,还是Rest方式,在压力测试下,性能最佳.而且处于跨平台的考虑,和自动化测试方便 ...
- Java 实现 SSH 协议的客户端登录认证方式--转载
背景 在开篇之前,让我们先对 SSH 协议有个宏观的大致了解,这样更有利于我们对本文的加深了解.首先要提到的就是计算机网络协议,所谓计算机网络协议,简单的说就是定义了一套标准和规则,使得不同计算机之间 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(二)示例
一.搭建RTSP服务器 要想测试RTSP客户端,没有服务端怎么行呢?然而,有时候条件有限,手头并没有独立的RTSP服务器拿来用,那么我们不妨自己撘一个. 以下有2种方便的做法可供选择: 第一种:使用v ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(三)RTSP命令解析
一.RTSP命令简述 RTSP是用来控制实时流媒体“播放”.“暂停”.“停止”.“录像”等行为的传输协议.该协议规定了一系列命令以及这些命令的发送格式,RTSP客户端可以通过发送这些指定的命令,从而控 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(一)简介
关于实时流媒体传输的开源库,目前流行的主要有两个:live555和jrtplib. 其中live555将rtp.rtcp和rtsp的传输协议实现集于一身,功能齐全,是个超强的集合体.但是对于嵌入式系统 ...
- 一个RTSP/RTP over TCP 的丢包引起的问题
背景知识:可以查看https://www.cnblogs.com/lidabo/p/4483497.html RTSP/RTP over TCP TCP承载RTSP/RTP When you us ...
- RTSP - RTP over TCP
RTP over RTSP(TCP)(一) RTP over RTSP包混合发送的解决办法 RTSP - RTP over TCP To use TCP communication, ...
随机推荐
- C#_类
1:访问修饰符 访问修饰符可以定义应用程序中类成员的作用域.和C++有一些不同,下面说明一下: public:访问不受限制,public成员可以被任何其他类访问. private:访问只限于包含该成员 ...
- 课下选做作业MySort
20175227张雪莹 2018-2019-2 <Java程序设计> 课下选做作业MySort 要求 注意:研究sort的其他功能,要能改的动代码,需要答辩 模拟实现Linux下Sort ...
- yum异常: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"
http://people.centos.org/hughesjr/chromium/6/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 ...
- AngularJS复习小结
开发移动端App,首先得在头部 <meta name="viewport" content="width=device-width, initial-scale=1 ...
- Qt VS MFC
最近用了一段时间Qt,觉得网上这篇文章讲述Qt与MFC之间的区别很到位,分享一下. ----------------------------------原文---------------------- ...
- arcgis python desc.dataType
desc = arcpy.Describe(r"C:\Users\dell\Documents\ArcGIS\ddd.shp") 是ShapeFile desc = arcpy.D ...
- Python 生成随机数函数和加密函数(MD5)
内容来自debugtalk import hashlib import random import string def gen_random_string(str_len): '''生成指定长度的随 ...
- 在 bat 批处理中运行多次 mvn
在 bat 中运行 mvn 命令会出现这种情况,构建命令执行完成后会停留在的 mvn.bat 中,必需手工输入 exit 后,才会回到原来的脚本中继续运行.这是怎么回事? 到 maven 的安装目录下 ...
- ubuntu下如何关闭某个端口?
1. 开启防火墙 sudo ufw enable 2. 关闭某个端口,如80端口 sudo ufw deny 80 3. 查询当前防火墙状态 sudo ufw status
- mybatis一对多映射【班级与学生】
1)如图 2)创建grades.sql和students.sql drop table students; drop table grades; create table grades( gid in ...