博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转 RTSP客户端模拟器(TCP方式,Python实现)
阅读量:5248 次
发布时间:2019-06-14

本文共 1967 字,大约阅读时间需要 6 分钟。

转自: http://www.cnblogs.com/MikeZhang/archive/2012/10/29/rtspTcpClient_DSS_20121029.html

由于某种需求,工作中需要自己要开发RTSP客户端模拟器……这里以DarwinStreamingServer(简称DSS)为例进行演示,把思路记录下来,算是开发了一个测试工具,也方便我以后查阅。在我之前的文章( )中介绍过怎样通过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) : break4     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://www.cnblogs.com/saryli/p/6133757.html

你可能感兴趣的文章
Kafka学习笔记
查看>>
【原创】Maven安装和配置
查看>>
Linux进程管理
查看>>
关于 自定义字体
查看>>
Octotree Chrome安装与使用方法
查看>>
用CALayer实现下载进度条控件
查看>>
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
查看>>
可编辑路由—Asp.NET MVC项目编译后,修改路由配置可动态加载
查看>>
UESTC 1330 柱爷与远古法阵【高斯消元】
查看>>
Tomcat修改用户名密码教程
查看>>
模块化概念
查看>>
基本排序
查看>>
一个障碍,就是一个超越自我的契机(转载)
查看>>
SPI ServiceLoader源码分析
查看>>
代码中一些常见的小片段
查看>>
python range( )函数
查看>>
前端非对称加密,后端Node.js解密(jsencrypt插件)(不需要密钥转码)
查看>>
linux 时间操作
查看>>
diverta 2019 Programming Contest 2自闭记
查看>>
周末总结
查看>>