一、 前言
流媒體的定義很廣泛,大多數(shù)時候指的是把連續(xù)的影像和聲音信息經(jīng)過壓縮處理后放上網(wǎng)站服務(wù)器,讓用戶一邊下載一邊觀看、收聽,而不需要等整個壓縮文件下載到自己機器就可以觀看的視頻/音頻傳輸、壓縮技術(shù)。流媒體也指代由這種技術(shù)支持的某種特定文件格式:壓縮流式文件,它通過網(wǎng)絡(luò)傳輸,并通過個人電腦軟件進(jìn)行解碼。面對流媒體技術(shù)的迅猛發(fā)展,作為軟件技術(shù)開發(fā)人員,關(guān)心的是將如何應(yīng)對的問題。流媒體的處理,以其復(fù)雜性和技術(shù)性,一向受到工業(yè)界和技術(shù)界的關(guān)注。特別是隨著互聯(lián)網(wǎng)的普及,流媒體通過網(wǎng)絡(luò)廣泛應(yīng)用在工業(yè)控制、現(xiàn)場監(jiān)控、視頻會議、大眾娛樂等方面,選擇一種合適的應(yīng)用方案,可以達(dá)到事半功倍的目的。
MCI是微軟為Windows最初提出的多媒體編程接口,它管理媒體控制接口(MCI)設(shè)備上的多媒體文件的記錄與回放。它被用來向諸如聲卡、MIDI 序列發(fā)生器、CD-ROM 驅(qū)動器、視頻CD播放器和視頻磁帶記錄器及播放器等設(shè)備發(fā)出MCI命令,還支持 Windows (*.avi) 視頻文件的回放。MCI編程實現(xiàn)起來并不困難,但是對于用戶要求獲取的某些有關(guān)壓縮數(shù)據(jù)流的信息和希望實現(xiàn)的某些功能,比如圖線尺寸、Copmression Rate、圖形的縮放顯示等,上敘控件所提供的為方便程序開發(fā)人員使用的高層接口已不適用,要想在此基礎(chǔ)上實現(xiàn)對底層的一些操作,難度可想而知;另外隨著多媒體技術(shù)的迅速發(fā)展,各種壓縮算法在該領(lǐng)域的的應(yīng)用,MCI技術(shù)越來越顯的力不從心,最明顯的是它不支持可變比特率的壓縮算法,對于處理DVD等近年出現(xiàn)的多種新的媒體格式也已經(jīng)顯的無能為力,怎么辦呢?為此我們介紹一種建立在DirectX技術(shù)上的方法來實現(xiàn)操作多媒體數(shù)據(jù)流。作為MCI的"接班人",微軟適時推出了建立在DirectX(包含DirectDraw、DirectSound、Direct3D)之上的DirectShow技術(shù),它是在DirectX之上的媒體層,支持來自本地或網(wǎng)絡(luò)的各種視頻、音頻壓縮格式的媒體文件的解碼和回放,可以從設(shè)備上捕捉多媒體流,可以回放各種壓縮算法處理的流媒體。這些格式包括:MPEG的音頻和視頻標(biāo)準(zhǔn)、音頻和視頻交互標(biāo)準(zhǔn)(AVI)、WAVE、MIDI和高級流格式ASF。
DirectShow對媒體數(shù)據(jù)處理采用流媒體(Multimedia Stream)的方式,在應(yīng)用中使用該方式可以大大的減少編程的復(fù)雜程度,同時又可以自動協(xié)商從數(shù)據(jù)源到應(yīng)用的轉(zhuǎn)換,流接口提供了統(tǒng)一的、可以預(yù)測的數(shù)據(jù)存取的控制方法,這樣應(yīng)用程序在播放媒體數(shù)據(jù)時不需要考慮它最初的來源和格式。
上面說了那么多,還沒有進(jìn)入正題,其實在Windows\System下有一個Windows中自帶的用于控制運動圖像播放的動態(tài)鏈接庫Quatrz.dll,它實現(xiàn)了對DirectShow的簡單封裝,或者說它是當(dāng)今流行的DirectShow技術(shù)的前身,在該庫中定義了IBasicAudio,IbasicVideo、IBasicVideo2,IMediaEvent 、IMediaEventEx、ImediaPosition、ImediaControl和IVideoWindow等類,程序開發(fā)人員可以利用它們方便地控制和操作各種格式的流媒體。例如,直接調(diào)用ImediaControl類的無參函數(shù)Run、Pause、Stop等就可以控制流媒體的播放進(jìn)程;利用IMediaPosition類對具體播放細(xì)節(jié)進(jìn)行定位操作等。對于流媒體的數(shù)據(jù)輸出顯示并不需要特別的控件,在VisualBasic編程中可以簡單的選擇一個窗體作為容器或一個PictureBox控件作為容器。為了使用該動態(tài)連接庫,你需要作的僅僅是在生成一個項目后,點擊VB開發(fā)環(huán)境的工程/引用菜單,在彈出的對話框中選擇ActiveMovie Control type library就可以了。
二、VB開發(fā)流媒體的播放技術(shù)
為了是說明如何在VB中利用ActiveMovie Control type library實現(xiàn)流媒體的播放,下面給出了一個名為VBDemo的項目實現(xiàn)代碼,該程序可以以不同的速率來播放wav、avi、mepg等多種格式的多媒體文件,同時顯示多媒體文件的長度、播放速率等信息。 在這個項目的窗體上定義一個FILE(名字為mnu_File)的主菜單,它包含OPEN(名字為mnu_FileOpen)和EXIT(名字為mnu_FileExit)子菜單,分別用于打開流媒體文件和退出應(yīng)用程序;工具條tbControlBar上定義三個按鈕,分別為實現(xiàn)流媒體的"播放"、"暫停"、"停止"功能的按鈕;名為picVideoWindow的PictureBox控件用來作為播放流媒體視頻數(shù)據(jù)的容器;slBanlance和slVolume兩個Slider控件分別用來控制媒體流的聲音大小和平衡度,它們的最小值分別為(-10000,0)和(-5000,5000);在界面的信息欄中,txtDuration和txtBox這兩個TextBox控件分別用來顯示正在播放的流媒體的時間長度和播放速率;關(guān)于播放速率,用戶可以通過optplaybackR單選框來選擇正常播放、兩倍速率播放還是半速播放。程序編譯后的界面如下(抱歉,使用考屏的方法無法將播放的圖像一同考貝下來):
程序的主要實現(xiàn)思路是在調(diào)用了Windows\System下動態(tài)鏈接庫Quatrz.dll的基礎(chǔ)上,定義一個全局的Object對象m_objMediaControl,令m_objMediaControl指向FilgraphManager的一個新實例,調(diào)用它的RenderFile函數(shù)裝載需要播放的流媒體文件,然后使用Run等函數(shù)就可以實現(xiàn)各種播放功能了;為了將流媒體的語音效果準(zhǔn)確的顯示出來,需要再定義一個IbasicAudio音頻對象m_objBasicAudio,用來提取流媒體的音頻數(shù)據(jù)并控制語音的大小,IMediaPosition 對象m_objMediaPosition是用來為多媒體文件定位的。最后顯示流媒體時需要打開一個播放Video的窗口,可以將picVideoWindow的句柄hWnd賦給的m_objVideoWindow的Owner屬性 ,這樣picVideoWindow就可以顯示接收的多媒體數(shù)據(jù)流了
流媒體的定義很廣泛,大多數(shù)時候指的是把連續(xù)的影像和聲音信息經(jīng)過壓縮處理后放上網(wǎng)站服務(wù)器,讓用戶一邊下載一邊觀看、收聽,而不需要等整個壓縮文件下載到自己機器就可以觀看的視頻/音頻傳輸、壓縮技術(shù)。流媒體也指代由這種技術(shù)支持的某種特定文件格式:壓縮流式文件,它通過網(wǎng)絡(luò)傳輸,并通過個人電腦軟件進(jìn)行解碼。面對流媒體技術(shù)的迅猛發(fā)展,作為軟件技術(shù)開發(fā)人員,關(guān)心的是將如何應(yīng)對的問題。流媒體的處理,以其復(fù)雜性和技術(shù)性,一向受到工業(yè)界和技術(shù)界的關(guān)注。特別是隨著互聯(lián)網(wǎng)的普及,流媒體通過網(wǎng)絡(luò)廣泛應(yīng)用在工業(yè)控制、現(xiàn)場監(jiān)控、視頻會議、大眾娛樂等方面,選擇一種合適的應(yīng)用方案,可以達(dá)到事半功倍的目的。
MCI是微軟為Windows最初提出的多媒體編程接口,它管理媒體控制接口(MCI)設(shè)備上的多媒體文件的記錄與回放。它被用來向諸如聲卡、MIDI 序列發(fā)生器、CD-ROM 驅(qū)動器、視頻CD播放器和視頻磁帶記錄器及播放器等設(shè)備發(fā)出MCI命令,還支持 Windows (*.avi) 視頻文件的回放。MCI編程實現(xiàn)起來并不困難,但是對于用戶要求獲取的某些有關(guān)壓縮數(shù)據(jù)流的信息和希望實現(xiàn)的某些功能,比如圖線尺寸、Copmression Rate、圖形的縮放顯示等,上敘控件所提供的為方便程序開發(fā)人員使用的高層接口已不適用,要想在此基礎(chǔ)上實現(xiàn)對底層的一些操作,難度可想而知;另外隨著多媒體技術(shù)的迅速發(fā)展,各種壓縮算法在該領(lǐng)域的的應(yīng)用,MCI技術(shù)越來越顯的力不從心,最明顯的是它不支持可變比特率的壓縮算法,對于處理DVD等近年出現(xiàn)的多種新的媒體格式也已經(jīng)顯的無能為力,怎么辦呢?為此我們介紹一種建立在DirectX技術(shù)上的方法來實現(xiàn)操作多媒體數(shù)據(jù)流。作為MCI的"接班人",微軟適時推出了建立在DirectX(包含DirectDraw、DirectSound、Direct3D)之上的DirectShow技術(shù),它是在DirectX之上的媒體層,支持來自本地或網(wǎng)絡(luò)的各種視頻、音頻壓縮格式的媒體文件的解碼和回放,可以從設(shè)備上捕捉多媒體流,可以回放各種壓縮算法處理的流媒體。這些格式包括:MPEG的音頻和視頻標(biāo)準(zhǔn)、音頻和視頻交互標(biāo)準(zhǔn)(AVI)、WAVE、MIDI和高級流格式ASF。
DirectShow對媒體數(shù)據(jù)處理采用流媒體(Multimedia Stream)的方式,在應(yīng)用中使用該方式可以大大的減少編程的復(fù)雜程度,同時又可以自動協(xié)商從數(shù)據(jù)源到應(yīng)用的轉(zhuǎn)換,流接口提供了統(tǒng)一的、可以預(yù)測的數(shù)據(jù)存取的控制方法,這樣應(yīng)用程序在播放媒體數(shù)據(jù)時不需要考慮它最初的來源和格式。
上面說了那么多,還沒有進(jìn)入正題,其實在Windows\System下有一個Windows中自帶的用于控制運動圖像播放的動態(tài)鏈接庫Quatrz.dll,它實現(xiàn)了對DirectShow的簡單封裝,或者說它是當(dāng)今流行的DirectShow技術(shù)的前身,在該庫中定義了IBasicAudio,IbasicVideo、IBasicVideo2,IMediaEvent 、IMediaEventEx、ImediaPosition、ImediaControl和IVideoWindow等類,程序開發(fā)人員可以利用它們方便地控制和操作各種格式的流媒體。例如,直接調(diào)用ImediaControl類的無參函數(shù)Run、Pause、Stop等就可以控制流媒體的播放進(jìn)程;利用IMediaPosition類對具體播放細(xì)節(jié)進(jìn)行定位操作等。對于流媒體的數(shù)據(jù)輸出顯示并不需要特別的控件,在VisualBasic編程中可以簡單的選擇一個窗體作為容器或一個PictureBox控件作為容器。為了使用該動態(tài)連接庫,你需要作的僅僅是在生成一個項目后,點擊VB開發(fā)環(huán)境的工程/引用菜單,在彈出的對話框中選擇ActiveMovie Control type library就可以了。
二、VB開發(fā)流媒體的播放技術(shù)
為了是說明如何在VB中利用ActiveMovie Control type library實現(xiàn)流媒體的播放,下面給出了一個名為VBDemo的項目實現(xiàn)代碼,該程序可以以不同的速率來播放wav、avi、mepg等多種格式的多媒體文件,同時顯示多媒體文件的長度、播放速率等信息。 在這個項目的窗體上定義一個FILE(名字為mnu_File)的主菜單,它包含OPEN(名字為mnu_FileOpen)和EXIT(名字為mnu_FileExit)子菜單,分別用于打開流媒體文件和退出應(yīng)用程序;工具條tbControlBar上定義三個按鈕,分別為實現(xiàn)流媒體的"播放"、"暫停"、"停止"功能的按鈕;名為picVideoWindow的PictureBox控件用來作為播放流媒體視頻數(shù)據(jù)的容器;slBanlance和slVolume兩個Slider控件分別用來控制媒體流的聲音大小和平衡度,它們的最小值分別為(-10000,0)和(-5000,5000);在界面的信息欄中,txtDuration和txtBox這兩個TextBox控件分別用來顯示正在播放的流媒體的時間長度和播放速率;關(guān)于播放速率,用戶可以通過optplaybackR單選框來選擇正常播放、兩倍速率播放還是半速播放。程序編譯后的界面如下(抱歉,使用考屏的方法無法將播放的圖像一同考貝下來):
程序的主要實現(xiàn)思路是在調(diào)用了Windows\System下動態(tài)鏈接庫Quatrz.dll的基礎(chǔ)上,定義一個全局的Object對象m_objMediaControl,令m_objMediaControl指向FilgraphManager的一個新實例,調(diào)用它的RenderFile函數(shù)裝載需要播放的流媒體文件,然后使用Run等函數(shù)就可以實現(xiàn)各種播放功能了;為了將流媒體的語音效果準(zhǔn)確的顯示出來,需要再定義一個IbasicAudio音頻對象m_objBasicAudio,用來提取流媒體的音頻數(shù)據(jù)并控制語音的大小,IMediaPosition 對象m_objMediaPosition是用來為多媒體文件定位的。最后顯示流媒體時需要打開一個播放Video的窗口,可以將picVideoWindow的句柄hWnd賦給的m_objVideoWindow的Owner屬性 ,這樣picVideoWindow就可以顯示接收的多媒體數(shù)據(jù)流了