zoukankan      html  css  js  c++  java
  • RTSP客户端模拟器(TCP方式,Python实现)

    由于某种需求,工作中需要自己要开发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 :客户端发起关闭请求;

    当然中间还有RTPRTCP的交互,这里就不叙述了。

    三、模拟器实现

    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

    四、运行效果

    个人见解,不足之处欢迎指出。

    好,就这些了,希望对你有帮助。

  • E-Mail : Mike_Zhang@live.com
  • 转载请注明出处,谢谢!
查看全文
  • 相关阅读:
    node(3)MVC代码结构模式moogoDB的学习
    node(2)
    node (1)
    函数上下文的判断
    JSON解析
    原生ajax
    new 关键字
    String 截取字符串#中间的文本
    WARN警告:Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended
    在Java8的foreach()中使用break、continue
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/rtspTcpClient_DSS_20121029.html
  • Copyright © 2011-2022 走看看