用Darwin開發RTSP級聯伺服器

2021-08-25 08:24:36 字數 3199 閱讀 9483

#**模組設計

darwin系統已經具有了我們所需的一定條件:rtspclient客戶端實現、rtp分發流程(reflectorsession),我們需要實現:darwin拉模式**模組,我們定義此模組名稱為qtssondemandrelaymodule,意為只有在有需要的時候,才會**;darwin與源端用於互動、儲存資訊、接收資料的clientsession,為了不影響darwin原有的架構,我們沒有直接在rtspclient類中修改,而是自定義類:rtspclientsession,例項化rtspclient物件為其成員變數:

在rtspclientsession中,所有rtsp流程都由fclient(rtspclient物件)完成,rtspclientsession負責進行變數儲存(如伺服器位址faddr、埠fport、使用者名稱fname、密碼fpassword)、收到資料報統計(fstates、fnumpacketreceived)、rtspclient控制(setup傳送fnumsetups、rtsp斷開fteardownimmediately)、以及在非客戶端斷開情況下,伺服器與攝像機間的重連

#**模組實現

我們命名拉模式**模組名稱為:qtssondemandrelaymodule,需要分別實現對rtsp和rtp的**和處理,如此,我們會分別處理qtss_rtsppreprocessor_role(rtsp訊息處理)、qtss_rtsprelayingdata_role(拉取的rtp資料處理)、qtss_clientsessionclosing_role(客戶端或rtspclientsession斷開處理)。

*qtss_rtsppreprocessor_role(rtsp訊息處理)

我們設計的拉模式**為名稱與位址對映的方式,對映列表配置在xml檔案中,在qtssondemandrelaymodule初始化時,我們就會將配置對映表載入到模組中,當然!我們也可以修改為讀取資料庫的方式:

例如,rtsp攝像機位址為:rtsp:**伺服器位址為:8.8.8.8,埠為:554,那麼客戶端請求:rtsp:**伺服器就會向rtsp: 請求攝像機資料,獲取後**給客戶端列表。對映查詢我們在dodescribe中進行:

qtss_error dodescribe(qtss_standardrtsp_params* inparams)// 對映資訊存在rtsp:rtspclientsession* clientses = null;// 首先查詢rtspclientsession hash表是否已經建立了對應攝像機的rtspclientsession

strptrlen streamname(theuristr);

osref* clientsesref = sclientsessionmap->resolve(&streamname);

if(clientsesref != null)

else

else

//增加一次對rtspclientsession的無效引用,後面會統一釋放

osref* debug = sclientsessionmap->resolve(&streamname);

assert(debug == clientses->getref());

}

// 建立**所用的reflectorsession,後續流程與qtssreflectormodule類似

reflectorsession* thesession = setupproxysession(inparams, clientses);

if (thesession == null)

}

這裡我們用到了兩個hash map,乙個是儲存rtspclientsession的sclientsessionmap、乙個儲存reflectorsession的ssessionmap。

*qtss_rtsprelayingdata_role(拉取的rtp資料處理)

當rtspclientsession獲取到乙個rtp包時,我們就會呼叫qtss_rtsprelayingdata_role,將rtp包push給reflectorsession進行分發,分發過程與qtssreflectormodule處理方式是一樣的,呼叫方法也同理:

*qtss_clientsessionclosing_role(客戶端和rtspclientsession斷開處理)

reflectorsession客戶端引用數統計、客戶端端斷開流程、rtspclientsession斷開流程,基本與rtspsession(客戶端與裝置推送)方法一樣:

void removeoutput(reflectoroutput* inoutput, reflectorsession* insession, bool16 killclients)

insession->setrelaysession(null);

ssessionmap->unregister(thesessionref);

delete insession;

}else}}

delete inoutput;

}

Darwin中RTSP協議的實現

基本概念 rtsp協議的實現 伺服器收到rtsp請求後會建立乙個rtsprequest物件,rtsprequest物件是由若干屬性構成的,這些屬性描述了乙個rtsp請求的方方面面。剛剛建立的rtsprequest物件只有qtssrtspreqfullrequest乙個屬性被賦值,qtssrtspre...

rtsp2rtm開發及測試

一 程式功能及用法 從rtspurl拉流,然後轉協議為rtmp,推送到fms指定的rtmpurl位址。多程序設計 當需要乙個轉協議程序時,就啟動乙個。其中,rtspurl可以重複,而rtmpurl是不能重複的。rtspurl可以重複是因為同乙個rtsp流可以分發到多個fms,而推流位址 rtmpur...

用AjaxPro實現二級聯動

page language c autoeventwireup true codefile test.aspx.cs inherits test using system using system.data using system.configuration using system.collec...