RTSP Server会不断用select查询是否有socket连接,如果有则在(*handler->handlerProc)(handler->clientData, resultConditionSet) 进行处理。
RTSPServer::RTSPClientConnection::incomingRequestHandler1()函数中,从socket读取客户端请求信息,然后解析RTSP命令,在变量fRequestBuffer中保存了RTSP请求信息:
例如:
OPTIONS rtsp://192.168.2.100:8554/3.ts RTSP/1.0
CSeq: 2
User-Agent: LibVLC/2.0.7 (LIVE555 Streaming Media v2012.12.18)

void RTSPServer::RTSPClientConnection::incomingRequestHandler1() {
  struct sockaddr_in dummy;
  // 'from' address, meaningless in this case  
  int bytesRead = readSocket(envir(), fClientInputSocket, &fRequestBuffer[fRequestBytesAlreadySeen], fRequestBufferBytesLeft, dummy);
handleRequestBytes(bytesRead);
}

Live555首先预解析请求字符串,判断请求是否符合标准。目前支持解析以下几种命令:
OPTIONS
GET_PARAMETER
SET_PARAMETER
DESCRIBE
SETUP
TEARDOWN
PLAY
PAUSE

然后发送响应给客户端:
例如:

RTSP/1.0 200 OK
CSeq: 2
Date: Wed, Jun 19 2013 16:05:27 GMT
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER

如果使用PLAY请求命令,Live555将调用
void RTSPServer::RTSPClientSession
::handleCmd_PLAY(
  RTSPServer::RTSPClientConnection* ourClientConnection,
  ServerMediaSubsession*  subsession,
  char const* fullRequestStr)函数进行处理。

请求数据如下:

PLAY rtsp://192.168.2.100:8554/3.ts/ RTSP/1.0
CSeq: 5
User-Agent: LibVLC/2.0.7 (LIVE555 Streaming Media v2012.12.18)
Session: E0406EAB
Range: npt=0.000-

首先定位流的位置,因为调试时使用的是ts流,
void MPEG2TransportFileServerMediaSubsession
::seekStream(
  unsigned clientSessionId,
  void* streamToken,
  double& seekNPT,
  double streamDuration,
  u_int64_t& numBytes);

之后就是开始播放流,

fStreamStates[i].subsession->startStream(fOurSessionId,
   fStreamStates[i].streamToken,    
   (TaskFunc*)noteClientLiveness, this,
   rtpSeqNum, rtpTimestamp,
    RTSPServer::RTSPClientConnection::handleAlternativeRequestByte,
    ourClientConnection);

该函数内会调用void OnDemandServerMediaSubsession::startStream(),继而调用StreamState::startPlaying()
void OnDemandServerMediaSubsession::startStream(unsigned clientSessionId,
   void* streamToken,
    TaskFunc* rtcpRRHandler,
    void* rtcpRRHandlerClientData,
        unsigned short& rtpSeqNum,
    unsigned& rtpTimestamp,
    ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler,
   
void* serverRequestAlternativeByteHandlerClientData);

在StreamState::startPlaying()中会创建一个RTCPInstance实例,并把客户端地址和端口添加到RTP和RTCPgroupsocks目的地中。再调用RTPSink::startPlaying()开始推送数据。

Live555研究之三 RTSP Server处理请求的更多相关文章

  1. LIVE555研究之三:LIVE555基础

    LIVE555基础 LIVE555是为流媒体提供解决方式的跨平台C++开源项目.从今天起我们将正式開始深入LIVE555代码. 一.各库简要介绍 LIVE555下包括LiveMedia.UsageEn ...

  2. live555学习之RTSP连接建立以及请求消息处理过程

    1,RTSP连接的建立过程    RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话.    首先创建RTSP服务 ...

  3. 【视频开发】RTSP SERVER(基于live555)详细设计

    /* *本文基于LIVE555的嵌入式的RTSP流媒体服务器一个设计文档,个中细节现剖于此,有需者可参考指正,同时也方便后期自己查阅.(本版本是基于2011年的live555) 作者:llf_17@q ...

  4. 使用live555 在linux下搭建 rtsp server

    系统环境 Debian 7 x64  / centos 7 x64  都可以 首先去下载源码 http://www.live555.com/liveMedia/public/live555-lates ...

  5. (转)live555 RTSP Server RTP over TCP BUG

    最近碰到一个非常棘手的问题,NVR通过ONVIF协议接入IPC进行录像,在录像时,会发现其中有个别IPC会出现录像断断续续的情况.这种情况很难复现,但是这种情况一旦出现,整个过程会一直持续很长时间,一 ...

  6. Live555研究之中的一个 源码编译

                                                Live555研究之中的一个 源代码编译 Live555 是一个为流媒体提供解决方式的跨平台的C++开源项目,它 ...

  7. LIVE555研究之五:RTPServer(二)

    port是一样的. DynamicRTSPServer 继承关系: Medium是非常多类的基类.内部定义了指向环境类的引用和一个char类型媒体名称.并定义了依照媒体名称,查找相应媒体的成员函数lo ...

  8. 基于Live555,ffmpeg的RTSP播放器直播与点播

    基于Live555,ffmpeg的RTSP播放器直播与点播 多路RTSP高清视频播放器下载地址:http://download.csdn.net/detail/u011352914/6604437多路 ...

  9. 【视频开发】【Live555】通过live555实现H264 RTSP直播

    前面的文章中介绍了<H264视频通过RTMP流直播>,下面将介绍一下如何将H264实时视频通过RTSP直播. 实现思路是将视频流发送给live555, 由live555来实现H264数据流 ...

随机推荐

  1. Python拷贝及多进程与类的问题

    最近写python写的尤其不顺利,更多的debug,逐渐的深入,产出却比较少.应该是个瓶颈期,坚持坚持,厚着脸皮也要坚持下去. 0x00 拷贝问题 程序中涉及到多进程和协程,大致的模型是开了2+个进程 ...

  2. 预告:准备开个坑,集中学习一下esp32模块

    对这个模块有兴趣的可以关注我以后的更新,寒假会抽空写几篇心得.

  3. linux复制多个文件到文件夹

    linux复制多个文件到文件夹 cp file1 file2 file3 directory即将文件file1 file2 file3复制到directory

  4. [转载]c# 多线程一个带多个参数的方法

    比如我要线程一个private void subPing(int pre,int end) 我在Thread t=之后应该如何写 用匿名委托吧!那么简单为什么要这样写!t = new Thread(d ...

  5. 作为 .Net 攻城师,所必需掌握的 .Net Profiling 技术

    众所周知,性能问题是所有实用应用在迭代过程中必然要面对的问题.对于此类问题,简单地投入更多硬件资源的做法可能会取得一定效果.但总的来看,此类做法的边际成本是不断上升的.换言之,随着性能需求的上涨,要换 ...

  6. 【C++基础】 多态 虚函数

    多态:同样的消息被不同类型的对象接收时导致不同的行为.这里“消息”是对类的成员函数的调用,“行为”调用了不同的函数. 分类:①重载多态 ②包含多态……等 实现:编译时的多态  运行时的多态(动态绑定) ...

  7. Kerbose

    http://blog.csdn.net/wulantian/article/details/42418231

  8. linux 磁盘读写性能测试

    1. 测试读取速度 haparm -Tt /dev/xxx 1.1 获取硬盘设备名称: fdisk -l Disk /dev/xvdf: 365.0 GB, 365041287168 bytes 25 ...

  9. ASP.NET如何使用JSON

    关于json,有一个官网:http://www.json.org 上面介绍了每种语言生成json格式的类库,我们只要把他们下载解压之后调用他们其中的组件即可,在.net中我用的是Newtonsoft. ...

  10. Qt之自定义控件(开关按钮)Qt之模拟时钟

    http://blog.csdn.net/u011012932/article/details/52164289 http://blog.csdn.net/u011012932/article/det ...