#**模組設計
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...