基本介紹
主體框架,相關協定,模組分類,工作流程,
主體框架
DSS的核心伺服器部分是由一個父進程所fork出的一個子進程構成,該父進程就構成了整合流媒體伺服器。父進程會等待子進程的退出,如果在運行的時候子進程產生了錯誤從而退出,那么父進程就會fork出一個新的子進程。可以看出,網路客戶和伺服器直接的對接是由核心伺服器來完成的。網路客戶RTSPoverRTP來傳送或者接受請求。伺服器就通過模組來處理相應的請求並向客戶端傳送數據包。
核心流媒體服務通過創建四種類型的執行緒來完成自己的工作,具體如下:
伺服器自己擁有的主執行緒。當伺服器需要關閉檢查,以及在關閉之前記錄相關狀態列印相關統計信息等任務處理時,一般都是通過這個執行緒來完成的。
空閒任務執行緒。這個任務執行緒是用來對一個周期任務佇列的管理,主要管理兩種任務,逾時任務和Socket任務。
事件執行緒。套接口相關事件由事件執行緒負責監聽,當有RTSP請求或者收到RTP數據包時,事件執行緒就會把這些實踐交給任務執行緒來處理。
任務執行緒。任務執行緒會把事件從事件執行緒中取出,並把處理請求傳遞到對應的伺服器模組進行處理,比如把數據包傳送給客戶端的模組,在默認情況下,核心伺服器會為每個處理器核創建一個任務執行緒。
相關協定
實時流媒體協定(Real Time Streaming Protocol,簡稱RTSP)
實時傳輸協定(Real Time Transport Protocol,簡稱RTP)
實時傳輸控制協定(Real Time Transport Control Protocol,簡稱RTCP)
對話描述協定(Session Description Protocol,簡稱SDP)
(1).實時流媒體協定
當我們需要創建並且對一個或多個時間的同步且連續的音視頻的媒體數據流控制的時候,我們需要用到RTSP協定,也就是實時流協定。RTSP並不是通過連續的數據流來創建並控制媒體流數據的,所以不會產生媒體流與控制流的交叉。用另外一種說法就是,RTSP本身是對流媒體伺服器的遠程控制。為了時間實時音視頻數據的受控(快進,暫停)以及按需分配流,這個協定為我們提供了可實現的框架。實時流控制協定可以用在對多個數據傳送的會話,通過UDP或者TCP方式,以及基於RTP傳送方式來實現。
(2).實時傳輸協定
RTP協定是網際網路上進行媒體數據的一種傳輸協定,為了實現一對一或者一對多的同步傳輸和提供時間信息,我們就會採用RTP協定。由於其典型套用建立在UDP傳輸之上,但也能在TCP或者ATM等其他協定上使用這個協定。實時傳輸協定本身只能對確保數據的實時性以及完整性,但並不對傳輸的順序以及傳輸可靠性提供保障。由於是建立在UDP協定之上,所以RTP協定本身並沒有提供流量控制或者阻塞控制,所以在一般情況下我們需要使用RTCP來進行這些幫助。由於DSS本身默認的傳輸協定就是RTP協定,而RTP協定需要通過RTCP協定進行流量控制,這樣很大程度上增加了機頂盒也就是解碼端的CPU處理壓力,因此本設計採用UDP協定直接對TS包進行傳送,不使用RTP協定進行數據封裝,由於UDP協定也缺少流量控制機制,我們使用PCR值來對傳送流量進行控制以防止接收端出現快取溢出影響播放質量。
(3).實時傳輸控制協定
實時傳輸控制協定的作用是管理傳輸的質量,也就是在進程間傳輸的同時相互交換信息。在建立RTP會話的時候,參與傳輸的雙方周期性的傳輸RTCP包,這個數據包中包含了所有相關傳輸的信息,比如數據包大小,丟失的數據包數量等等。因此通常我們利用RTCP來對傳輸流量或有效載荷進行動態調整,同時與RTP配合有效的控制傳輸速率,所以特別適合傳送實時數據。
(4).對話描述協定
對話描述協定(SDP)就是用來描述多媒體會話通告,多媒體會話邀請和其他形式的多媒體會話初始化的協定。SDP協定對流媒體描述的具體信息如下:會話名和會話目的,會話發起時間,會話中相關的網路信息,會話發起者的相關信息,媒體類型,傳輸所使用的協定,流媒體編碼格式,傳輸時所使用的連線埠號,IP網路地址。因此我們可以通過解析SDP協定來獲取我們所需要的一些必要的相關信息。
其中RTSP是非常重要的協定,因此後面會結合原代碼做一個詳細的分析,這個結果對設計模組有著非常重要的影響,也可以說是本設計的關鍵。
模組分類
流媒體伺服器使用模組來回響各種請求及完成任務。有三種類型的模組:
(1).內容管理模組
媒體源相關的RTSP請求與回響,我們通過內容管理模組來管理,每個模組都用來對客戶的需求進行解釋並做相應處理,例如讀取和解析模組支持的檔案,或者請求的網路源信息,並通過RTP等方式回響。
內容管理模組有以下幾個:
QTSSFileModule,
QTSSReflectorModule,
QTSSRelayModule,
QTSSMP3StreamingModule。
(2).伺服器支持模組
伺服器支持模組執行伺服器數據的收集和記錄功能。
伺服器模組包括:
QTSSErrorLogModule,
QTSSAccessLogModule,
QTSSWebStatsModule,
QTSSWebDebugModule,
QTSSAdminModule,
QTSSPOSIXFileSystemModule。
(3).訪問控制模組
訪問控制模組提供鑒權和授權功能,以及操作URL路徑提供支持。
訪問控制模組包括:
QTSSAccessModule,
QTSSHomeDirectoryModule,
QTSSHttpFileModule,
QTSSSpamDefenseModule。
工作流程
在DSS中的模組分為動態模組和靜態模組,動態模組在伺服器啟動時會首先裝載動態模組,之後才會裝載一部分靜態模組。我們一般建議將我們自己書寫的功能模組編譯為動態模組來替換或擴展現有的伺服器模組,因為它會被優先裝載。在QTSS的模組中必須包含Register這個角色,這也是每個模組所必須支持的角色。在模組被裝載之後伺服器會調用每個模組的Register角色。在這個角色當中,模組會調用QTSS_AddRole函式來記錄這個模組所支持的其他角色。然後伺服器就將初始化角色來調用每一個擁有這個角色的模組。這個角色主要是做一些初始化的任務,比如說記憶體的分配或者對數據結構的初始化等等。在關閉伺服器的時候,所有模組的Shutdown角色將被調用,這個角色主要是為了結束工作後處理現場,比如釋放記憶體等等。流媒體伺服器主要就是通過這種角色來完成相應任務的。