live555 接收rtsp視頻流流程分析

live555 接收rtsp視頻流流程分析

RTSP交互流程

C
表示RTSP客戶端,S表示RTSP服務端

C->S: OPTIONrequest         //詢問S有哪些方法可用

S->C: OPTION response      //S
迴應信息中包括提供的所有可用方法

C->S: DESCRIBErequest     //要求得到S提供的媒體初始化描述信息

S->C: DESCRIBE response    //S
迴應媒體初始化描述信息,主要是sdp

C->S: SETUPrequest       //設置會話屬性,以及傳輸模式,提醒S建立會話

S->C: SETUP response      //S
建立會話,返回會話標識符及會話相關信息

C->S: PLAYrequest        //C請求播放

S->C: PLAY response       //S
迴應請求信息

S->C:
發送流媒體數據

C->S: TEARDOWNrequest    //C請求關閉會話

S->C: TEARDOWN response    //S
迴應請求

上述的過程是標準的RTSP流程,其中第3步和第4步是必需的。

OpenCore
在執行完PLAYER_SET_DATASOURCEprepare之後,執行PLAYER_INIT時,如果發現datasourcertsp流,則進入rtsp模塊。

OpenCore
RTSP模塊實現在Pvrtsp_client_engine_node.cpp中,PVRTSPEngineNode::SendRtspDescribe()描述了連接建立過程中的狀態變化過程。

需要注意的時,opencore在發出OPTION request後,並不會等着收response,而是直接發DESCRIBE request,然後纔開始收OPTION responseDESCRIBE response

Live555
RTSPServer.cpp中用RTSPServer::RTSPClientSession::incomingRequestHandler()來處理來自client端的request

 

 

RTSP源碼接收端使用樣例:

//RtstClientTest.cpp

#include"stdafx.h"

#include"RtspRequest.h"

#include"Rtp.h"

 

RtspRequest g_RtspRequest;

int_tmain(int argc, _TCHAR* argv[])

{

 //接收

  string url ="rtsp://192.168.1.1:554/aacAudioTest";

  string setupName ="aacAudioTest";

  INT rtpPort =8080;

  INT rtcpPort =rtpPort + 2;

  stringsdp;

  INT64sess;

 g_RtspRequest.Open(url.c_str(), "127.0.0.0", 0);

 g_RtspRequest.RequestOptions();

 g_RtspRequest.RequestDescribe(&sdp);

 g_RtspRequest.RequestSetup(setupName.c_str(), transportModeRtpUdp,rtpPort , rtcpPort , &sess);

 g_RtspRequest.RequestPlay();

  Rtp* pRtp = newRtp();

 pRtp->Open("127.0.0.0", rtpPort);

  PBYTE pBuffer =new BYTE[1024*1024*10];

  intiRead;

  INTpayloadType;

  WORDsequenceNumber;

  INT32timeStamp;

  INT32ssrc;

 while(TRUE)

  {

     iRead = pRtp->Read(pBuffer, 1024*1024*10,&payloadType, &sequenceNumber,&timeStamp, &ssrc);

     if (iRead > 0)

     {

         // save buff   

     }

 

  }

  deletepRtp;

 g_RtspRequest.RequestPause();

 g_RtspRequest.RequestTeardown();

 g_RtspRequest.Close();

  delete[]pBuffer;

  return0;

 

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章