[live555] 从testRTSPClient.cpp PLAY 请求 四

本文深入剖析RTSP协议中的PLAY请求流程,包括从SETUP请求后如何触发PLAY请求,以及PLAY请求后的响应处理过程。文章详细介绍了live555源码中testRTSPClient.cpp的PLAY请求实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

因为play 流程和DESCRIBE 和SETUP一样,所以,已经需要分析的内容很少,除了RTCP
[live555] 从testRTSPClient.cpp DESCRIBE 发起请求 一
[live555] testRTSPClient.cpp DESCRIBE (后续处理) 二
[live555] 从testRTSPClient.cpp SETUP请求 三

PLAY 请求

对比 SETUP 请求大部分流程是一样的,在SETUP,发送请求后,continueAfterSETUP中发起PLAY请求

void continueAfterSETUP(RTSPClient* rtspClient, int resultCode
            , char* resultString) {
//....
setupNextSubsession(rtspClient);
}

setupNextSubsession 处理

// We have a "m=" line, representing a new sub-session:
MediaSubsession* subsession = createNewMediaSubsession();


void setupNextSubsession(RTSPClient* rtspClient) {
    scs.subsession = scs.iter->next();
    if (scs.subsession != NULL){...}//因为iter 只有一个subsession所以为null

    if (scs.session->absStartTime() != NULL) {
        rtspClient->sendPlayCommand(*scs.session, continueAfterPLAY
        , scs.session->absStartTime(), scs.session->absEndTime());
     } else {
        scs.duration = scs.session->playEndTime() - scs.session->playStartTime();
        rtspClient->sendPlayCommand(*scs.session, continueAfterPLAY);
     }
}

absStartTime 是播放开始时间,PLAY之前都为NULL,发送PLAY请求

continueAfterPLAY

发送完请求,会通过轮询回调continueAfterPLAY

接收response 消息

void RTSPClient::handleResponseBytes(int newBytesRead) {

    if (responseCode == 200) {
      // Do special-case response handling for some commands:
      if (strcmp(foundRequest->commandName(), "SETUP") == 0) {
        if (!handleSETUPResponse(*foundRequest->subsession(), sessionParamsStr, transportParamsStr, foundRequest->booleanFlags()&0x1)) break;
      } else if (strcmp(foundRequest->commandName(), "PLAY") == 0) {
        if (!handlePLAYResponse(foundRequest->session(), foundRequest->subsession(), scaleParamsStr, speedParamsStr, rangeParamsStr, rtpInfoParamsStr)) break;
      } else if (strcmp(foundRequest->commandName(), "TEARDOWN") == 0) {
        if (!handleTEARDOWNResponse(*foundRequest->session(), *foundRequest->subsession())) break;
      } else if (strcmp(foundRequest->commandName(), "GET_PARAMETER") == 0) {
        if (!handleGET_PARAMETERResponse(foundRequest->contentStr(), bodyStart, responseEnd)) break;
      }
    } 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值