第一章 系統簡介
近年來,視頻監控市場的發展已經進入高速時期,與此同時,隨著各大運營商對基礎網絡建設的巨大投入,快速地推動了網絡攝像機在各個領域的快速發展應用。安卓在Google的推進以及本身的開放性作用下,已經延生到生活的各個方面,從安卓智能手機、平板,到可穿戴的Android Ware、眼鏡、手表、再到Android汽車、智能家居、電視,甚至日本出的幾款機器人都是Android系統的,傳統監控中的移動終端設備,例如:單兵設備、手持設備、車載終端設備,包括家庭監控中用到的智能設備,都可以用Android系統替代了,不僅開發容易,而且易擴展,設備也更加智能了。在此思路下我們實現了Android手機的音視頻采集與上傳、流媒體服務器轉發、多平臺播放器播放的實時監控系統。
1.1 視頻采集安卓端(spydroid)
Google Code上有一個開源項目:spydroid-ipcamera,spydroid能在Android手機中建立一個精簡的HTTP Server和RTSP Server,功能類似于一般的IpCamera,既能夠通過網頁訪問攝像機并修改監控配置,還能通過http或者rtsp協議,獲取監控的實時音視頻。具體原理是,通過android手機對mediaRecorder錄制視頻,把localsocket傳輸到本地的流經過硬編碼,添加RTP頭,分離NALU包,根據RTSP協議交互過程把數據發送到對方。而且從其代碼結構中,spydroid已經實現了RTSPServer、RTSPClient、RTP、RTCP、H264、AAC...等等功能,總之,音視頻采集與上傳需要的Utility都已經具備了,我們將這些功能組合到一塊實現了直播需求。
1.2 流媒體服務器(Darwin Streaming Server)
Darwin Streaming Server簡稱DSS。DSS是Apple公司提供的開源實時流媒體播放服務器程序。整個程序使用C++編寫,在設計上遵循高性能,簡單,模塊化等程序設計原則,務求做到程序高效,可擴充性好。并且DSS是一個開放源代碼的,基于標準的流媒體服務器,可以運行在Windows NT和Windows 2000,以及幾個UNIX實現上,包括Mac OS X,Linux,FreeBSD,和Solaris操作系統上的。
1.2.1 主體框架
DSS的核心服務器部分是由一個父進程所fork出的一個子進程構成,該父進程就構成了整合流媒體服務器。父進程會等待子進程的退出,如果在運行的時候子進程產生了錯誤從而退出,那么父進程就會fork出一個新的子進程?梢钥闯觯W絡客戶和服務器直接的對接是由核心服務器來完成的。網絡客戶RTSPoverRTP來發送或者接受請求。服務器就通過模塊來處理相應的請求并向客戶端發送數據包。
核心流媒體服務通過創建四種類型的線程來完成自己的工作,具體如下:
服務器自己擁有的主線程。當服務器需要關閉檢查,以及在關閉之前記錄相關狀態打印相關統計信息等任務處理時,一般都是通過這個線程來完成的。
空閑任務線程。這個任務線程是用來對一個周期任務隊列的管理,主要管理兩種任務,超時任務和Socket任務。
事件線程。套接口相關事件由事件線程負責監聽,當有RTSP請求或者收到RTP數據包時,事件線程就會把這些實踐交給任務線程來處理。
任務線程。任務線程會把事件從事件線程中取出,并把處理請求傳遞到對應的服務器模塊進行處理,比如把數據包發送給客戶端的模塊,在默認情況下,核心服務器會為每個處理器核創建一個任務線程。
1.2.2 相關協議
如果要使用QuickTime流媒體服務器的編程接口,您應該熟悉該服務器實現的互聯網工程組織(Internet Engineering Task Force,簡稱IETF)協議,列舉如下:
實時流媒體協議(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.2.3 模塊
流媒體服務器使用模塊來響應各種請求及完成任務。有三種類型的模塊:
1. 內容管理模塊
媒體源相關的RTSP請求與響應,我們通過內容管理模塊來管理,每個模塊都用來對客戶的需求進行解釋并做相應處理,例如讀取和解析模塊支持的文件,或者請求的網絡源信息,并通過RTP等方式響應。
內容管理模塊有以下幾個:
QTSSFileModule,
QTSSReflectorModule,
QTSSRelayModule,
QTSSMP3StreamingModule。
2. 服務器支持模塊
服務器支持模塊執行服務器數據的收集和記錄功能。
服務器模塊包括:
QTSSErrorLogModule,
QTSSAccessLogModule,
QTSSWebStatsModule,
QTSSWebDebugModule,
QTSSAdminModule,
QTSSPOSIXFileSystemModule。
3. 訪問控制模塊
訪問控制模塊提供鑒權和授權功能,以及操作URL路徑提供支持。
訪問控制模塊包括:
QTSSAccessModule,
QTSSHomeDirectoryModule,
QTSSHttpFileModule,
QTSSSpamDefenseModule。
1.2.4 工作流程
在DSS中的模塊分為動態模塊和靜態模塊,動態模塊在服務器啟動時會首先裝載動態模塊,之后才會裝載一部分靜態模塊。我們一般建議將我們自己書寫的功能模塊編譯為動態模塊來替換或擴展現有的服務器模塊,因為它會被優先裝載。在QTSS的模塊中必須包含Register這個角色,這也是每個模塊所必須支持的角色。在模塊被裝載之后服務器會調用每個模塊的Register角色。在這個角色當中,模塊會調用QTSS_AddRole函數來記錄這個模塊所支持的其他角色。然后服務器就將初始化角色來調用每一個擁有這個角色的模塊。這個角色主要是做一些初始化的任務,比如說內存的分配或者對數據結構的初始化等等。在關閉服務器的時候,所有模塊的Shutdown角色將被調用,這個角色主要是為了結束工作后處理現場,比如釋放內存等等。流媒體服務器主要就是通過這種角色來完成相應任務的。
1.3 視頻播放器(VLC)
VLC多媒體播放器(初命名為VideoLAN客戶端)是VideoLAN計劃的多媒體播放器。它支持眾多音頻與視頻解碼器及文件格式,并支持DVD影音光盤,VCD影音光盤及各類流式協議。它也能作為unicast或 multicast的流式服務器在IPv4或 IPv6的高速網絡連接下使用。它融合了FFmpeg計劃的解碼器與libdvdcss程序庫使其有播放多媒體文件及加密DVD影碟的功能。
優秀的開源播放器可以播放MPEG-1、MPEG-2、MPEG-4、DivX、DVD/VCD、數字衛星頻道、數字地球電視頻道(digital terrestial television channels)、在許多作業平臺底下透過寬頻 IPv4、IPv6網絡播放線上影片;此軟件開發項目是由法國學生所發起的,參與者來自于世界各地,設計了多平臺的支持,可以用于播放網絡串流及本機多媒體檔案之播放。