咱們在開發視頻直播或者監控類項目的時候,如場館監控、學校監控、車載監控等等,每每首先但願的是造成一個項目的雛形,而後再在這個框架的基礎上進行不斷的完善和擴展工做,那麼咱們今天要給你們介紹的就是,如何造成一個這樣的框架:html
採集本地音視頻數據(Win) -->視頻分發服務器-->客戶端隨意接入git
大體流程:咱們首先經過DShow採集Windows(XP、Win7通過測試)主機的視頻設備(Camera)和音頻設備(Mic)的音視頻資源,通過live555的RTSP推送流程和RTP封包過程,將直播數據推送給Darwin分發服務器,Darwin分發服務器接收live555的推送數據並作相應的緩存(超過緩存時間的數據將會被移除),同時響應客戶端的接入,將推送來的直播數據轉發給客戶端。github
設備採集端:採集端是以live555爲基礎框架,以DarwinInjector作爲與Darwin交互的接口,再在live555 Source端分別實現CamH264VideoStreamFramer(H264視頻)和AudioInputMicDevice(AAC音頻)的數據源。緩存
固然,在採集和發送數據以前,咱們須要進行的是與Darwin服務器之間的信令通道交互,這裏咱們採用的是RTSP標準的Announce(SDP payload)、Setup、Play過程,讓Darwin服務器端創建轉發類(主要是在QTSSReflectorModule中),等待RTP數據的推送。服務器
設備採集端代碼:http://pan.baidu.com/s/1y1E8s 微信
轉發服務器:轉發服務器是RTSP服務器Darwin Streaming Server,在以前的博客:基於DSS的推送式轉發已經描述了RTSP標準推送流程,這裏只說明一點小小的修改,就是在Darwin中,當設備端意外斷線,也就是不通過標準的RTSP Teardown流程就與服務器斷開的話,服務器端將會等待設備推送超時纔會釋放轉發資源,那麼對於這一點,咱們作了一個小小的更改,這個在:Darwin推送端斷開的處理問題中已經描述了。那麼最新代碼的下載能夠到EasyDarwin開源項目中去獲取:https://github.com/xiejiashu/EasyDarwin,後續對Darwin的擴展,如分佈式RTSP服務器、RTSP直播服務器、服務器端錄像、Hint模塊等功能,都會在這個開源項目中加入,但願有興趣的朋友加入到這個開源項目組中來。框架
客戶端端:客戶端固然不用太多描述,標準的RTSP流播放器都能播放Darwin視頻,不過若是有想開發RTSP客戶端的朋友,也能夠加入到討論羣中(288214068)。tcp
框架擴展:在上述的流程中,咱們是在採集程序一開啓時,就開始向Darwin服務器推送數據,那麼在一般狀況下,點播或者直播一般都是On Demand的形式,就是說,只有有須要的時候,咱們才推送視頻給服務器,沒有須要的時候,設備處在空閒狀態的,那麼咱們可不能夠在上述的框架上作到這一點呢?固然能夠!分佈式
如上圖,咱們能夠先在設備端,開啓一條tcp通道,鏈接到Darwin服務器,Darwin服務器中擴展一個管理模塊,專門管理與設備的通訊與接入,這樣,在服務器不須要設備數據的時候,只與設備保持信令通道的鏈接和暢通就能夠了,當有須要設備當前音視頻數據的時候,就經過這條信令通道發送開啓命令,採集設備收到命令(自定義命令),就開始本地採集、編碼、打包和RTP傳輸流程,RTP通道能夠與信令通道公用也能夠單獨創建,不過建議仍是單獨創建的好。當服務器端對此設備分發的客戶端數量爲0或者其餘更高級的需求來到時,能夠經過信令通道,發送中止命令到採集設備,這樣採集設備就中止本地採集、編碼等工做,進入最開始時候的空閒等待狀態。如此,就實現了實時視頻的點播效果。固然,圖中的轉發模塊與管理模塊能夠在同一個程序裏面開發,也能夠分開,分爲管理服務器和轉發服務器。ide
------------------------------------------------------------
本文轉自www.easydarwin.org,更多開源流媒體解決方案,請關注咱們的微信:EasyDarwin