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. OO之策略模式

    以下为策略模式详解: 引子: 使用策略就是要实现可扩展性,那么多态是不可少的.何谓可扩展性呢? 比如:我们用面向对象的思想来设计飞机,基类为飞机,飞机可以有很多种,客机,直升机,战斗机等,不同种类的飞 ...

  2. Xcode8 重新配置 CocoaPods -替换阿里源

    一.CocoaPods是什么? CocoaPods是一个负责管理iOS项目中第三方开源库的工具.CocoaPods的项目源码在Github上管理.该项目开始于2011年8月12日,在这两年多的时间里, ...

  3. 100 doors

    Question There are 100 doors in a row that are all initially closed. You make 100 passes by the door ...

  4. Netty4.x中文教程系列(二) – 白话概念

    "Hello World"的代码固然简单,不过其中的几个重要概念(类)和 Netty的工作原理还是需要简单明确一下,至少知道其是负责什.方便自己以后更灵活的使用和扩展.   声明, ...

  5. YUV格式详解

    What is YUV YUV,是一种颜色编码方法. YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV, ...

  6. HDU 1158 Employment Planning (DP)

    题目链接 题意 : n个月,每个月都至少需要mon[i]个人来工作,然后每次雇佣工人需要给一部分钱,每个人每个月还要给工资,如果解雇人还需要给一笔钱,所以问你主管应该怎么雇佣或解雇工人才能使总花销最小 ...

  7. 【无聊放个模板系列】POJ 3678 2-SAT

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

  8. request重定向或者是response转发请求后面的代码依然执行

    调用response.redirect(),或者request.getRequestDispatcher(loginAddr).forward(request,response);后,后面的代码照样执 ...

  9. Qt的版本历史

    发展史 Qt的第一个商业版本于1995年推出,随后Qt的发展就很快了,下面是Qt发展史上的一 些里程碑,从之前的Qt1.x开始到现在的Qt5.x. Qt1-3 版本 发布日期 1.40 10 July ...

  10. 【Lucene3.6.2入门系列】第04节_中文分词器

    package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apach ...