基于IOCP的MPEG-4出租車無線視頻監(jiān)控系統(tǒng)設計與實現(xiàn)
引言
本文引用地址:http://www.butianyuan.cn/article/81678.htm出租車行業(yè)的發(fā)展給人們的出行帶來了極大的便利,伴隨租出車數量的增多一些針對出租車的強盜案件也逐年上升,出租車公司對車輛狀態(tài)的監(jiān)測也成為緊迫的需求。針對此種情況開發(fā)了基于MPEG-4的出租車無線視頻監(jiān)控解決方案,本文主要介紹方案的軟件系統(tǒng)。本系統(tǒng)同已有的局域網監(jiān)控相比具有明顯的優(yōu)勢。不受地域、距離限制無須布線,非常適合出租車分布范圍廣,移動范圍大,終端數量多的特性。
MPEG-4(ISO/IEC14496)通過幀重建技術來壓縮和傳輸數據,以極少的數據量獲得了極佳的圖像效果,已成為目前市場上數字視頻編解碼技術的主流。
本文結合出租車實際情況設計了整體架構,硬件電路,軟件框架和具體實現(xiàn)的整套解決方案。硬件設計劃分為基于TMS320DM270雙核處理器的視頻采集處理模塊、CDMA傳輸模塊和GPS接收模塊。軟件設計劃分為整體調度模塊、采用完IOCP技術的網絡傳輸模塊、采用XviD開放源碼構造的MPE-4視頻解壓播放模塊、基于MySQL的數據庫存儲模塊。整個系統(tǒng)模型具有很高的擴展性,各部分功能方便重用和替換,經測試是一套實用可靠的高效方案。
系統(tǒng)總體結構
網絡拓撲結構
網絡拓撲結構圖如圖1所示,整個系統(tǒng)分為3部分。
·CDMA網中的出租車終端
每一臺出租車裝有一個嵌入式設備,包括CDMA通訊模塊、GPS采集模塊、視頻輸入輸出模塊和基于TMS320DM270的MPEG-4編碼、控制模塊,在出租車終端完成視頻信號的采集、轉換和壓縮。從CDMA內網發(fā)起對服務器的連接,進行通訊。
·服務器
高性能服務器架設在公網,通過出租車終端的IP和ID管理各個終端,所有監(jiān)控終端與出租車終端通訊的命令和請求也都通過服務器進行轉發(fā),可以通過服務器設置不同監(jiān)控終端的訪問權限,出租車報警后發(fā)送的視頻和圖片數據都在服務器備份,實時GPS數據通過數據庫保存。
·客戶端
采用C/S模式,在普通PC機上安裝客戶端軟件,在Internet上的任意位置,使用經過授權的用戶名及密碼可訪問有固定IP地址的服務器實現(xiàn)實時監(jiān)控。
·軟件體系結構
軟件的體系結構及各個部分之間的數據流和控制流的交互如圖2。
服務器端主要有5個模塊
1)服務器主控制模塊:完成整個服務器系統(tǒng)的初始化,解析網絡模塊接收到的數據和命令,調用其他模塊進行相應的處理,實現(xiàn)具體功能
2)網絡傳輸模塊:所有的數據流和控制命令都通過調用網絡傳輸模塊的接收和發(fā)送功能來實現(xiàn)。
3)用戶管理模塊:對登錄到服務器的用戶進行身份和權限認證。根據設定的權限和分組規(guī)則,為用戶提供對應的服務??尚薷墓芾韱T和個人用戶密碼。保證系統(tǒng)的安全性和保密要求。
4)文件操作模塊:增加、刪除、修改、查詢文件。對接收到需要保存的圖片和圖像數據寫文件保存,為客戶端的請求提供文件。
5)數據庫模塊:增加、修改、查詢和刪除,GPS信息、錯誤記錄和日志記錄。
客戶端有3個模塊
1)視頻顯示模塊:調用sPlayer.ocx解壓顯示圖像。
2)地圖顯示模塊:通過對sinomaps的地圖控件二次開發(fā)生成mapspeed.ocx,實時顯示出租車的位置。
3)文件操作模塊和網絡模塊與服務器端的功能基本相同。
系統(tǒng)主要技術
MPEG-4視頻壓縮技術
MPEG-4標準稱為甚低比特率視音頻編碼標準(Very low bit rate audio visual coding) ,正式編號是ISO/IEC14496。MPEG一4標準是一個基于對象內容的視音頻編碼壓縮標準.其目標是利用最少的數據獲得最佳自勺圖像質量和聲音質量,它是一種多媒體數據框架和格式的定義,而不只是具體算法.它將眾多的多媒體應用集成于一個完整的標準框架內。為視音頻多媒體數據提供通用、靈活、高效、開放的編碼算法工具皮編碼方案。建立起能夠被多媒體傳輸、存取、檢索等不同應用普遍采用的統(tǒng)一數據格式。
測試表明,MPEG-4視音頻全同步時數據流量為36Kb~336Kb,僅為MJPG或MPEG1的1/10,畫面質量可以達到近似DVD的效果。
XviD編解碼技術
·多種編碼模式
除了最原始單重估定碼流壓縮(1一passCBR)之外,XviD提供了包括:單重質量模式動態(tài)碼流壓縮、單重量化(Quantization)模式動態(tài)碼流壓縮、和包括外部控制和內部控制的兩種雙重(2一pass)動態(tài)碼流壓縮模式。XviD顯然是目前PC上的MPEG4編碼內核中,可選模式最多的視頻編碼。
·量化方式和范圍控制
XviD不僅提供了標準的MPEG量化方式,還特地提供了更適合低碼流壓縮的H.263量化方式。并且XviD還可以在雙重(2-pass)運算時,根據對畫面信息的綜合分析,動態(tài)的決定某段場景的畫面量化方式。除了量化方式選擇,XviD還提供了強大的對壓縮過程中的量化幅度的范圍控制。
運動偵測和曲線平衡分配
XviD提供了多極運動偵測精度。包括半像素插值(half pixel interpolation)的技術以l6x16像素的微區(qū)塊為單元標示上運動矢量;以及4分運動矢量(inter4v motion vectors)的方式,以8x8的像素區(qū)塊為單元更細致的紀錄運動向量以供二重分析。
·動態(tài)關鍵幀距
在視頻壓縮中,I幀記錄全部的畫面信息,而后續(xù)插入的P幀(P—Frame)僅記錄下與之前一幀的差值。因此根據畫面鏡頭切換和運動幅度變換關鍵幀I幀的位置,對于視頻壓縮下的畫面質量提高,有明顯效果。
·人類視覺系統(tǒng)HVS(Human Visual System)
人類視覺系統(tǒng),根據人類視覺的特性,建立模型,量化的時候根據這些特性,將人眼較不敏感的區(qū)域壓得差一點,將人眼較容易注意到的區(qū)域壓得好一點,可以提升肉眼看起來的品質。
完成端口(IOCP)機制
IOCP(I/O Completion Port,輸入/輸出完成端口)是一種能夠合理利用與管理多線程的機制。該機制使用完成端口,用一定數量的線程處理重疊I/O(Overlapped I/O)技術,幫助處理大量客戶端請求,并使系統(tǒng)的性能達到較佳狀態(tài) 。從性能上考慮,與采用Select模型和Overlapped模型相比,采用完成端口模型在請求響應的并行性上更勝一籌,I/O完成端口提供的多線程特性是一般異步模型所無法達到的。而且IOCP尤其適合為大量I/O請求提供服務,對于提高服務器效率大有裨益。
系統(tǒng)分析與實現(xiàn)
本解決方案的開發(fā)基礎為Windows Server2003,開發(fā)工具為VC.NET2003。
數據包裝和解析的實現(xiàn)
網絡傳輸數據包通過自加包頭進行解析,通過不同通道傳送視頻數據/控制命令。加載過程如圖3。
服務器的網絡傳輸部分的實現(xiàn)
服務器通過UI線程和Worker線程池(Threads Poo1)來確保服務器對多個客戶端的并發(fā)控制和通訊。服務器通訊功能主要實現(xiàn)簡述如下:
1.啟動監(jiān)聽線程并初始化完成端口(IOCP)核心對象,進入對CDMA終端喝監(jiān)控終端的監(jiān)聽狀態(tài),主要通過CreateIoCompletionPort函數實現(xiàn),此函數主要實現(xiàn)兩個功能1)建立IOCP對象,2)將接受到的套接字(SOCKET)同IOCP關聯(lián)。
HANDLE CreateIoCompletionPort(
HANDLE FileHandle,//功能1時為INVALID_HANDLE_VALUE,功能2時為接受的SOCKET
HANDLE ExistingCompletionPort,,//功能1時賦值NULL,功能2時輸入已建立的IOCP對象
ULONG_PTR CompletionKey,//完成鍵自設的數據結構,功能1時為NULL,功能2時完成鍵
DWORD NumberOfConcurrentThreads ) //同時可操作IOCP對象的線程數,設為CPU數×2+2
2.調用異步接收函數WSARecv()發(fā)起接收 SAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
3.查看完成端口的通訊隊列,異步接收出租車終端發(fā)送的數據和通訊命令,通過調用GetQueuedCompletionStatus( )函數實現(xiàn),
BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort,//查看的完成端口對象
LPDWORD lpNumberOfBytes,,// 期望讀入的字節(jié)數
PULONG_PTR lpCompletionKey,// 完成鍵,自設的數據結構
LPOVERLAPPED* lpOverlapped,// 重疊IO標志,每次查詢時需事先清零復位
DWORD dwMilliseconds) // 設置查詢超時時間
4.自設完成鍵數據結構如下,包含
struct CMD_CDMA_LINK_INFO
{ SOCKET m_hSocket; // 通訊套接字SOCKET
UINT m_uiCDMAId; //無符號整型變量保存出租車終端ID
CString m_strCDMAIP; //字符串變量保存出租車終端IP地址
bool m_bCmdCDMALinkState; //布爾型變量保存連接狀態(tài)
int m_nNumberOfPendlingIO; //整型變量保存掛起I/O數
bool m_bAlarm; //布爾型變量保存報警標志
CCriticalSection m_cmdCDMALinkInfoLock; };//臨界區(qū)變量,作線程同步
客戶端的解壓實現(xiàn)
客戶端也采用多個線程并行處理的模式,分別負責數據通訊、數據處理、解壓顯示和地圖刷新,MPEG-4的解碼主要采用XviD解壓庫。MPEG-4協(xié)議有非對稱性的特點,即壓縮運算量大,復雜性高,為保證視頻信息的實時性,視頻采集壓縮由硬件完成;而解壓運算量較小,可以借鑒XviD編解碼技術來實現(xiàn)。如前所述,XviD編解碼技術有很多突出的優(yōu)點。在解碼過程中解壓主函數實現(xiàn)如下
int CDecThread::dec_main(BYTE* istream, BYTE* ostream,int istream_size,
xvid_dec_stats_t * xvid_dec_stats)
{int ret=XviD_ERR_FAIL; //默認值-1
/* Reset all structures */
memset(&xvid_dec_frame, 0, sizeof(xvid_dec_frame_t));
memset(xvid_dec_stats, 0, sizeof(xvid_dec_stats_t)); //初始化所有數據結構
/* Set version設置解壓版本*/
xvid_dec_frame.version = XviD_VERSION;
xvid_dec_stats->version = XviD_VERSION;
/* No general flags to set //設置主標志位*/
xvid_dec_frame.general = 0;
/* Input stream輸入解壓數據流*/
xvid_dec_frame.bitstream = istream;
xvid_dec_frame.length = istream_size;
/* Output frame structure輸出幀結構 */
xvid_dec_frame.output.plane[0] = ostream;
xvid_dec_frame.output.stride[0] = m_nXDIM*m_nBPP;
xvid_dec_frame.output.csp = m_nCSP;
ret = xvid_decore(dec_handle, XviD_DEC_DECODE, &xvid_dec_frame, xvid_dec_stats);
return(ret);
}
結語
本文從MPEG-4數字視頻監(jiān)控的定制系統(tǒng)出發(fā),通過研究,提出了一般的實現(xiàn)方法。通過模塊化設計并使用COM封裝,使系統(tǒng)主體做到與前端硬件的低耦合度,易于維護 使用完成端口技術傳輸視頻,同時,客戶端軟件使用Xvid實現(xiàn)了解壓。本文所淪述的方法已經在實際工程中得到應用,取得了良好的效果。
參考文獻:
1. 楊合慶.Windows 網絡編程第二版.清華大學出版社,2002.
2. 劉諱瑋.Visual c++視頻/音頻開發(fā)實用工程案例精選.北京:人民郵電出版杜,2004.
3. 張益貞,劉 滔,Visual c++6.0實現(xiàn)MPEG/JPEG編解碼技術,北京:人民郵電出版社,2002.
4. 劉諱瑋.Visual c++視頻/音頻開發(fā)實用工程案例精選.北京:人民郵電出版杜,2004.
c++相關文章:c++教程
cdma相關文章:cdma原理
評論