----1.引言
----銀行的數位監視監控系統是目前比較有市場及應用前景的開發項目,基於不同的MPEG採集卡與硬體外圍設備開發的監視監控系統在國內外都有較為成型的技術。為了滿足即時監視、即時擷取壓縮、隨時回放、壓縮資料流的傳播等具體要求,在該系統中使用了一種用於網路視訊/音訊多點傳輸(視訊廣播)的視訊資料擷取卡,提供AVI (MPEGIFrame壓縮編碼)採集、MPG採集。發送端廣播MPEG串流,接受端接受MPEG串流並顯示,網路傳輸採用WinSock2ip-Multicast。若本機為發送端,網路上另外任何一台PC可以作為接收端。只要指定不同連接埠號,同時可以有多台PC機作為發送端,多台PC機作為接收端接收不同發送端的視訊數據,也可在傳送資料的同時在本機將資料存為MPEG檔案。本文主要介紹在VB的環境下開發MPEG卡所採集的Audio/Video資料播放的一些程式設計技巧。
----2. MPEG的內容與發展簡介
----多媒體資訊主要包括圖像、聲音和文字三大類。其中視訊、音訊等訊號的資訊量是非常大的,而且這些資訊的表達方式、輸入、輸出的要求也各不同。對這些數據進行有效的表達和適當處理是很重要的,它使多媒體資訊壓縮技術成為多媒體通訊領域中的關鍵技術之一。 ISO與IEC於1988年聯合成立的MPEG(MovingPictureExpertGroup),致力於運動影像及其伴音編碼的全球標準化工作。它包括MPEG系統:MPEG視訊、MPEG音訊。為了推動社會由文字訊息時代向多媒體資訊時代過渡,ISO繼MPEG-1、2和4後又推出了MPEG-7。
----MPEG-1制定於1993年(ISO/IEC11172),是針對1.5Mbit/s以下資料傳輸速率的數位儲存媒介運動影像及其伴音編碼的國際標準。視訊壓縮率為26:1。 MPEG-2制定於1995年(ISO/IEC13818),是CCIR601建議的影像品質DVB、HDTV和DVD制定的3-10Mbit/s的動態影像及其伴音編碼的國際標準。與前面基於資訊理論的波形編碼理論,針對某一位元速率的視訊、音訊編碼的MPEG標準不同的是,於1998年11月公佈的國際標準MPEG-4更重視多媒體系統的互動性和彈性。它引入AV物件(Audio/VisualObjects),使得更多的互動操作成為可能。 1998年10月國際標準化組織又推出了MPEG-7的構想,預計於2001年初最終完成並公佈,其正式名稱為"多媒體內容描述介面"(MultimediaContentDescriptionInterface)。它提出了一種適用於現實生活中的各種多媒體內容的標準化描述方案,以提取待描述對象的各方面特徵為基礎,方便人們對所需的多媒體材料進行快速、有效的檢索。
----3. VB開發MPEG--Audio/Video資料流的播放技術
----3.1. VB中MultimediaMCI控件,MediaPlayer控製播放MPEG資料流的缺點
----VB中常用的多媒體控制是MultimediaMCI控制,它管理媒體控制介面(MCI)裝置上的多媒體檔案的記錄與回放。它被用來向諸如音效卡、MIDI序列產生器、CD-ROM驅動器、視訊CD播放器和視訊磁帶記錄器及播放器等設備發出MCI命令,也支援Windows(*.avi)視訊檔案的回放。採用MultimediaMCI控製播放所擷取的MPEG資料流,播放速度比即時監控顯示快,在測試時還發現MPEG檔案長度縮短到500k-600k時,就無法看到播出的影像了。改用VB中的MediaPlayer控制項上敘缺點仍然存在。分析原因是:因為MPEG檔案長度太短了,播放裝置剛開啟就已經關閉了,這是程式設計無法控制的。而且,對於用戶要求獲取的某些有關壓縮資料流的資訊和希望實現的某些功能,比如圖線尺寸、CopmressionRate、圖形的縮放顯示、界面的美觀等,上敘控件所提供的為方便程序開發人員使用的高層介面已不適用,若要在此基礎上實現對底層的一些操作,難度可想而知。在解決上敘實際性問題時,我們呼叫了動態連結函式庫Quatrz.dll。
----3.2.提供對MPEG流方便的底層操作和高層介面的動態連結庫Quatrz.dll
----在Windows/System下可以找到一個動態連結庫Quatrz.dll,這是Windows中帶的用於控制運動圖像的播放的一個類型庫,只要在VB的"引用"菜單中將它添加進來即可使用。在本庫中定義了IBasicAudio,IBasicVideo和IBasicVideo2,IMediaEvent、IMediaEventEx、IMediaPosition等類,可方便地在CommandButton控制項的Click等事件中新增程式碼設定和讀取Audio的相關值,設定或讀取Video的輸入輸出來源的相關參數,直接呼叫無參函數Run、Pause、Stop等控製播放事件進程,利用IMediaPosition類別對特定播放細節進行操作。對於壓縮的MPEG資料流的輸出顯示並不需要特別的控件,在VisualBasic中你可以選擇一個窗體作為容器或窗體上的PictureBox控件作為容器。為了介面的美觀和使用者查取相關資訊的方便,我們採用了PictureBox控制項作為容器顯示播放的MPEG資料流。
----3.3.用PictureBox控制項顯示MPEG資料流
----VisualBasic中PictureBox控制項可以顯示來自點陣圖、圖示或元文件,以及來自增強的元檔案、JPEG或GIF檔案的圖形。亦可在程式碼中操作圖形屬性和方法,以建立動畫或進行模擬。在窗體上放置了一個PictureBox控制項picTV,在呼叫了Windows/System下動態連結函式庫Quatrz.dll的基礎上,定義一個全域的Object物件pMC,令pMC指向FilgraphManager的一個新實例,開啟壓播放的M PEG檔;再定義一個局部物件pVW為IVideoWindow的新實例,開啟一個播放Video的視窗;令pVW=pMC,給物件引用pVW賦值,將picTV的屬性值hWnd賦給pVW的Owner,這樣picTV就能顯示接收的MPEG資料流了。具體操作如下:
SetpMC=NewFilgraphManager
pMC.RenderFile"C:/Bank/Montior/Example.MPG"
SetpVW=pMC
pVW.WindowStyle=CLng(&H6000000)
pVW.Left=0
pVW.Top=0
OldWidth=pVW.width
OldHeight=pVW.Height
picTV.width=pVW.width*15
picTV.Height=pVW.Height*15
pVW.Owner=picTV.hWnd
----可以單獨定義一個函數包含這些程式碼,也可將其放到CommandButton控制項的Click事件中。
----3.4. MPEG資料流的縮放顯示
----放大或縮小MPEG影像是各種多媒體播放軟體中常用的影像顯示處理手段。 VisualBasic中對於靜態圖片進行縮放處理可以使用Image控件,將控件的Stretch屬性設為True,則裝入的圖片會改變比例適應Image控件的範圍,因此對圖片的縮放處理變成對Image控件的Height、 Width屬性值的大小變化。由於控制項的尺寸變化,顯示的點距不能改變,造成顯示點的像素點與圖片無法完全一一對應,顯示品質明顯變差。只有Image控制項才能對圖片進行縮放,如果PictureBox控制不足以顯示整個圖象,則裁切圖像以適應控制項的大小。要實現用PictureBox控制實現對輸出MPEG影像的縮放,必須改變MPEG資料流的輸出比例,在調節PictureBox控制項的尺寸去適應輸出的MPEG影像。實際上,在上面的第3小節裡,為了顯示輸出MPEG影像已經這麼做了。只不過用的是讀取的MPEG影像OldWidth、OldHeight,下面舉出一個以原來的1/2大小輸出MPEG影像的範例。
pVW.width=OldWidth/2
pVW.Height=OldHeight/2
picTV.Left=135
picTV.Top=135
picTV.width=pVW.width*15
picTV.Height=pVW.Height*15
pVW.Owner=picTV.hWnd
----在放大或縮小MPEG影像的尺寸時要注意保持Width、Height的比例一致,以免輸出的影像變形。
----3.5.滑鼠拖曳播放MPEG資料流
----用滑鼠拖曳捲軸隨意播放MPEG資料流是Windows中多媒體播放機播放VCD的常用技術。 VB中的Slider控制項是包含滑桿和可選擇性刻度標記的窗口,可以透過拖曳滑桿,用滑鼠點選滑桿的任一側或使用鍵盤移動滑桿。在選擇離散數值或某個範圍內的一組連續數值時,Slider控制十分有用。透過將滑桿移到刻度標記處,可以對MPEG資料流進行定位播放。在窗體上放置一個Slider控制Slider1,設定好遊標移動的最大步長LargeChange=5,最小步長SmallChange=1,最大移動範圍Max=50,實作程式如下:
PRivateSubSlider1_Scroll()
'
DimpMPAsIMediaPosition
DimvAsDouble
IfNotbOpenThenExitSub
bSeeking=True
pMC.Pause
SetpMP=pMC
v=Slider1.Value-Slider1.Min
v=v/Slider1.Max*pMP.Duration
pMP.CurrentPosition=v
SetpMP=Nothing
pMC.Run
'
EndSub
----3.6. MPEG資料流採集時間的獲取
----VisualBasic裡提供了一個函數FileDateTime可用於取得檔案建立或是更新的日期與時間。定義一個局部物件pMP為IMediaPosition的新實例,令pMP=pMC,給物件引用pMP賦值;再定義兩個Double型的變數curpos、length,將pMP.CurrentPosition賦給curpos,取得MPEG資料流的目前相對位置時間,將pMP.Duration賦給length,取得MPEG資料流的時間長度值;就能取得MPEG資料流相對的擷取時間。根據MPEG擷取檔案所建立的特性將兩個日期時間作加法或減法則可以得到MPEG資料流的擷取時間。
----在整個MPEG的播放過程中,都要求即時顯示MPEG資料流的擷取時間,可定義一個取得擷取時間的函數,並採用Timer控制項的Timer事件來驅動。透過引發Timer事件,Timer控制項可以規律地隔一段時間執行一次函數取得到MPEG資料流的擷取時間。
----4.結束語
----將成熟的影像壓縮技術用於電視監視監控領域具有十分重要的意義。例如:在銀行的監視監控系統中,由於客戶(銀行)身分的特殊性,在對冒領他人存款、銀行失竊或被搶劫等擾亂銀行正常工作秩序的事件的調查及其處理中,採集的壓縮資料流是很重要的辦案線索與證據。在這個系統中不僅要求監視畫面清晰,採集的資料冗餘度低,MPEG資料流的播放技術也是很重要的。本文介紹了在Windows環境下,利用VisualBasic自身條件和原有控制開發MPEG卡所擷取的Audio/Video資料的播放技術。充分利用了VB的優越條件,靈活地與VB中各種現有控制結合,開發出來的MPEG媒體播放器功能完善,回放的MPEG畫面能清晰地重現數據採集時場景、做到了"聞其聲,見其人"、並能準確確定事件發生的時間時刻。對只記錄了單幀的Audio/Video資料流也能同樣播放。上述技術已在監控系統中使用,效果良好。 ->