主頁(http://www.130131.com):基于AVI的網絡視頻監(jiān)控存儲系統(tǒng)實現方法
1.網絡視頻監(jiān)控系統(tǒng)介紹 網絡視頻監(jiān)控系統(tǒng)是一個基于客戶機/服務器模型的系統(tǒng),由視頻服務器端和客戶端組成。視頻服務器是一個由SAA7113、PNX1301、RTL8139等組成的嵌入式系統(tǒng),SAA7113實現視頻的采集;PNX1301是系統(tǒng)的核心,對視頻數據進行處理,如視頻編碼、報警檢測、云鏡控制等;RTL8139負責數據傳輸,數據通過網絡與客戶端交互。 客戶端是一臺通用計算機,客戶端有選擇性地連接單個或者多個服務器,經過身份驗證后可以向監(jiān)控服務器發(fā)送命令,從監(jiān)控服務器獲取壓縮視頻流和其他測量數據,從而實現遠程視頻監(jiān)控。 系統(tǒng)采用XVID視頻編解碼器對圖像數據進行壓縮,因為XVID開放源碼,可以將它移植到PNX1301的PSOS操作系統(tǒng)中,對圖像數據進行編碼;客戶端計算機從網絡接收壓縮的視頻數據,使用相同版本的XVID解碼器解碼,即可得到圖像數據。 2.XVID視頻壓縮格式 2.1.XVID的特點 XVID支持多種編碼模式,除了最原始單重估定碼流壓縮(1-passCBR)之外,XVID提供了包括:單重質量模式動態(tài)碼流壓縮、單重量化(Quantization)模式動態(tài)碼流壓縮、和包括外部控制和內部控制的兩種雙重(2-pass)動態(tài)碼流壓縮模式。 XVID的運動偵測(MotionSearch)特性,為需要高碼流的運動畫面可以分配更多空間、更高的碼流、更低的量化幅度來保持畫面的細節(jié);而對于不包含太多運動信息的靜態(tài)畫面,則消減分配預算。這是XVID做為第二代MPEG4編碼的核心內容。 XVID支持動態(tài)關鍵幀距(I-frameinterval)和B幀,即雙向預測幀。此外還支持心理視覺亮度修正、演員表選項。畫面優(yōu)化解碼等。 2.2.XVID的編解碼實現方法 XVID源碼有三部分構成:xvidcore、vfw、dshow,可以用MicrosoftVisualC++和NASM編譯。本文使用MicrosoftVisualC++2003.net和NASM-0.98.39編譯成功,其中編譯dshow項目還需要安裝DirectX9.0SDK。 xvidcore工程生成XVID編解碼器的API函數庫:xvidcore.dll;vfw工程生成XVID編解碼器在Windows下的安裝文件:xvidvfw.dll和xvid.inf;dshow生成XVID在Windows下注冊文件:xvid.ax。 由于本文的XVID編碼部分在PNX1301中實現,在此只介紹XVID的解碼部分。 1)加載xvidcore.dll庫函數 使用XVID的API函數需要加載xvidcore.dll庫,并包含vfw.h和xvid.h頭文件,調用API函數的方法如下: HINSTANCEm_hdll=LoadLibrary("xvidcore.dll"); xvid_global_func=(int(__cdecl*)(void*,int,void*,void*))GetProcAddress(m_hdll,"xvid_global"); xvid_decore_func=(int(__cdecl*)(void*,int,void*,void*))GetProcAddress(m_hdll,"xvid_decore"); 2)初始化編解碼器 xvid_global_func(0,XVID_GBL_INIT,&init,NULL); 3)創(chuàng)建解碼器 intlength=xvid_decore_func(0,XVID_DEC_CREATE,&create,NULL); 4)結果輸出設置 xvid_dec_frame_t結構是解碼的主要參數,其中輸出部分需要設置輸出緩沖區(qū)、步長和輸出類型,在顏色深度是24位的情況下,RGB格式的數據步長為圖像寬度的3倍。 frame.output.plane[0]=ostream; frame.output.stride[0]=CALC_BI_STRIDE(width,24); frame.output.csp=XVID_CSP_VFLIP|XVID_CSP_BGR; 5)解碼 intlength=xvid_decore_func(dhandle,XVID_DEC_DECODE,&frame,&stats); 3.利用AVI格式存儲視頻 AVI(AudioVideoInterleaved的縮寫)是一種RIFF(ResourceInterchangeFileFormat的縮寫)文件格式,用于音視頻捕捉、編輯、回放等應用程序中。通常情況下,一個AVI文件可以包含多個不同類型的媒體流(典型的情況下有一個音頻流和一個視頻流),不過含有單一音頻流或單一視頻流的AVI文件也是合法的。AVI可以算是Windows操作系統(tǒng)上最基本的、也是最常用的一種媒體文件格式。 3.1.AVI視頻文件結構 ’avih’:文件信息(AVIFILEINFO格式),’strh’:數據流信息(AVISTREAMINFO格式),’strf’:格式化信息(BITMAPINFO格式)。 3.2.安裝XVID編解碼器 在Windows下使用XVID編解碼器,需要安裝XVID編解碼器。
3.3.存儲AVI視頻文件 微軟提供了一套API對AVI文件進行讀寫,使用這些庫函數需要在程序中加載vfw32.lib庫和vfw.h頭文件。本文的對AVI文件的操作都使用此庫中的函數。 如果要對數據流進行壓縮,可以使用AVISaveOptions和AVIMakeCompressedStream函數,選擇操作系統(tǒng)中已經安裝的視頻編解碼器。由于本文從視頻服務器得到的是已經編碼的XVID格式數據流,所以不需要這個步驟。 3.3.1.獲取原始數據 首先獲取幀數據的長度,然后獲取文件中的原始數據。 AVIStreamRead(pVideoStream,lFrames,AVISTREAMREAD_CONVENIENT,NULL,0,&lSize,NULL);
AVIStreamRead(pVideoStream,lFrames,AVISTREAMREAD_CONVENIENT,pBuffer,lSize,NULL,NULL);
|



