live555學習ing

參考網上文章調試了一個例子,實現從攝像頭IPC通過rtsp獲取碼流轉發到EasyDarwin服務器功能
參考文章:https://blog.csdn.net/xiejiashu/article/details/34434669

使用testRTSPClient例子編譯了一個rtspclient,從EasyDarwin服務器獲取碼流功能

記錄下相關信息:

使用的live555版本是2015年的,因爲最新的版本去掉了DarwinInjector.cpp,不支持對Darwin的支持,後面有必要在考慮整合到最新版本的live555中

下載了文章中的代碼,把轉發IPC的代碼合併到自己的工程中,由於live555版本的區別,編譯不過,用比較工具查看代碼,然後把ProxyServerMediaSubsession類的聲明從ProxyServerMediaSession.cpp移到了ProxyServerMediaSession.hh中,同時增加了兩個函數,編譯通過,增加的函數是:

  char const* mediumName() const { return fClientMediaSubsession.mediumName(); }
  unsigned char rtpPayloadFormat() const { return fClientMediaSubsession.rtpPayloadFormat(); }

修改緩衝大小:

main函數中需添加
OutPacketBuffer::maxSize = 800000;

創建live555基本環境,所有live555程序必須的:

scheduler = BasicTaskScheduler::createNew();
env = BasicUsageEnvironment::createNew(*scheduler);

用ProxyServerMediaSession類實現連接IPC碼流功能

sms = ProxyServerMediaSession::createNew(*env, NULL, src);

此調用會創建跟IPC的rtps連接
類的繼承關係:

ProxyServerMediaSession->ServerMediaSession->Medium

ProxyServerMediaSession的構造函數會創建ProxyRTSPClient,ProxyRTSPClient類繼承關係:

ProxyRTSPClient->RTSPClient -> Mediu
ProxyServerMediaSubsession -> OnDemandServerMediaSubsession -> ServerMediaSubsession - >Medium

創建ProxyRTSPClient的時候實際調用到的是的構造函數,之後調用ProxyRTSPClient::sendDESCRIBE,最終調用到RTSPClient::sendDescribeCommand,發送DESCRIBE命令。

DESCRIBE發送成功後調用,用sdp信息調順序:

 ProxyRTSPClient::continueAfterDESCRIBE
 ProxyServerMediaSession::continueAfterDESCRIBE 
 MediaSession::createNew創建  MediaSession對象
 MediaSession::initializeWithSDP用sdp初始化MediaSession對象
 createNewMediaSubsession(),創建MediaSubsession對象,可能創建多個,如:有音頻和視頻,會創建兩個,根據SDP信息初始化MediaSubsession對象相關信息,添加到MediaSession對象的鏈表fSubsessionsHead中
 ProxyServerMediaSubsession,根據MediaSubsession創建ProxyServerMediaSubsession對象,添加到ServerMediaSession的鏈表中

創建source:
用ProxyServerMediaSubsession對象調用ProxyServerMediaSubsession::createNewStreamSource分別創建音視頻source,是FramedSource類型對象

RTSPClient::sendSetupCommand發送SETUP命令
ProxyRTSPClient::continueAfterSETUP,SETUP發送成功後調用這個函數
RTSPClient::sendPlayCommand,發送PLAY命令,連接音視頻流

創建sink:
創建兩個Groupsock對象,分別用來轉發視頻,音頻流

用ProxyServerMediaSubsession對象調用ProxyServerMediaSubsession::createNewRTPSink創建視頻、音頻sink,是RTPSink類型:
H264VideoRTPSink::createNew,區分視頻類型創建H264sink

創建DarwinInjector對象,並將sink添加到DarwinInjector對象中

DarwinInjector::createNew,創建DarwinInjector對象
DarwinInjector::addStream,添加sink
DarwinInjector::setDestination,建立與服務推流連接

sink對象調用MediaSink::startPlaying開始轉發

MediaSink::startPlaying
H264or5VideoRTPSink::continuePlaying
MultiFramedRTPSink::continuePlaying
H264or5Fragmenter::doGetNextFrame()
H264or5Fragmenter::afterGettingFrame1
H264or5Fragmenter::afterGettingFrame

continuePlaying和doGetNextFrame循環調用

Boolean DarwinInjector::setDestination函數修改,解決沒有RTCP時候不能發送音頻問題:

  if (ss->rtcpInstance() != NULL) {
ss->rtcpInstance()->setStreamSocket(fRTSPClient->socketNum(),
				    streamChannelId++);
  }
  else
  {
	  streamChannelId++;    //add 解決無rtcp的時候音頻問題
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章