鐘 寧
媒體是指信息的載體,是信息的存在和表現(xiàn)形式,包括數(shù)字、文字、聲音、圖形和圖像等。隨著計算機技術(shù)的發(fā)展,人們不再使用單一的文字作為信息的載體,而是通過各種各樣的媒體如圖形、圖像、音頻、視頻來傳遞、存儲信息。利用VC6.0使用API函數(shù)來實現(xiàn)對多媒體控制接口MCI的調(diào)用來編寫多媒體數(shù)字視頻應(yīng)用程序,可以滿足大多數(shù)應(yīng)用在性能上的要求。
MCI是MicrosoftWindows定義的多媒體接口標(biāo)準。MCI向Windows提供高層次的,獨立于設(shè)備的,控制各種多媒體設(shè)備的命令。通過MCI命令,可以直接對多媒體外部設(shè)備進行控制,如控制光驅(qū)及聲卡播放CD盤音樂、控制多媒體動畫播放、控制視頻卡視頻信號采集等。MCI封裝了各種多媒體設(shè)備的具體控制細節(jié),編程人員完全可以在不了解各種多媒體構(gòu)造、工作原理和如何控制的條件下,只通過對MIC函數(shù)進行操作就完全有效地對多媒體設(shè)備進行控制,大大縮短了開發(fā)多媒體應(yīng)用程序的時間,提高了開發(fā)效率。MCI是一種訪問多媒體設(shè)備的高層次方法,獨立于設(shè)備,使得原有的函數(shù)不會因為硬件設(shè)備的品牌、各類控制參數(shù)的變更而不再適用,大大提高了程序的可移植性和可靠性。另外,MCI提供了功能強大的,可以在C語言中直接調(diào)用的函數(shù)庫。其庫文件包含在VC++的子目錄下面,不需要另行購買。
MCI的訪問可以通過兩種方式:一種是使用消息命令接口函數(shù);另一種是使用字符串接口函數(shù)。它們的不同之處在于有著不同的命令結(jié)構(gòu)和發(fā)送信息到多媒體設(shè)備的不同原理。任何一種方式都可以達到同樣的結(jié)果,具體的方式的選擇可根據(jù)編程人員的習(xí)慣來定。
MCI提供的設(shè)備控制指令接近于自然語言,MCI是Windows為多媒體應(yīng)用程序開發(fā)人員所提供支持底層API的應(yīng)用組件,可以通過VC6.0等高級語言調(diào)用。應(yīng)用程序通過MCI向多媒體設(shè)備發(fā)出命令字符串,控制媒體設(shè)備,或從媒體設(shè)備上得到相關(guān)的信息。MCI指令字符串語法格式如下:
Commanddevice_nameargument
Command表示MCI動作指令,常用的有Open、Close、Play、Pause、Step、Back、Setp、Prev、Next、Record、Status、Save等。
device_name為設(shè)備類型、媒體文件名或別名。
argument為命令參數(shù)。
對于一個多媒體設(shè)備或文件,首先要用Open命令打開,然后用Play命令播放,最后用Close命令關(guān)閉,以釋放設(shè)備。這三條基本命令的語法如下:
Opendevice[aliasdevice_id][typedevice_type][wait]
Playdevice_id[formposition][toposition][wait]
Closedevice.id
Win32API即為Microsoft32位平臺的應(yīng)用程序編程接口,所有在Win32平臺上運行的應(yīng)用程序都可以調(diào)用這些函數(shù)。Windows系統(tǒng)提供了100多個具有多媒體處理能力的API函數(shù),而VC6.0可以直接使用WindowsAPI函數(shù)的功能,通過使用API函數(shù),以實現(xiàn)對MCI命令的調(diào)用。
在Windows系統(tǒng)提供的眾多媒體處理能力的API函數(shù)中,比較重要的有MCISendCommand()(傳送MCI指令消息給MCI,并返回執(zhí)行結(jié)果信息),MCISendString()(向一個MCI設(shè)備發(fā)送字符串命令來控制設(shè)備,并返回執(zhí)行結(jié)果消息),MCIGetErrorString()(解釋返回錯誤代碼的具體含義),MCIGetDeviceID()(打開一個設(shè)備后,返回這個設(shè)備的ID號),MCIExecute()(傳送MCI指令字符串給MCI,不返回執(zhí)行結(jié)果消息。若執(zhí)行過程有錯誤,出現(xiàn)對話框給出錯誤信息)。
1、MCISendCommand()函數(shù)傳遞指令信息速度快,可以非常深入的控制多媒體設(shè)備。但編程比較復(fù)雜。MCISendCommand()函數(shù)使用的語法如下:
DWORDMCISendCommand(MCIDEVICEIDIDDevice,UINTuMsg,DWORDfdwConnand,DWORDdwParam);
Iddevice:標(biāo)識一個MCI設(shè)備。當(dāng)MCI使用MCI_OPEN控制消息打開一個多媒體設(shè)備時,可以不傳入這個參數(shù),只需要指定為空。如果打開正常,MCI會自動創(chuàng)建一個32位的整數(shù)來標(biāo)識已經(jīng)打開的多媒體設(shè)備。
uMsg:標(biāo)識向設(shè)備發(fā)出消息的類型,具體的消息有MCI_OPEN,MCI_PLAY等等。
FdwConnand:與uMsg消息相關(guān),用來指定消息的具體操作方式,為消息標(biāo)志。
DwParam:是一個指向消息數(shù)據(jù)結(jié)構(gòu)的指針,其結(jié)構(gòu)由具體的消息類型來決定。
如果函數(shù)執(zhí)行成功,返回值為空,否則返回錯誤代碼信息。錯誤代碼的高位包含了設(shè)備的ID,低位值是錯誤的代碼。
2、MCISendString()函數(shù)傳遞指令字符串,使用方便,但由于要將指令字符串轉(zhuǎn)換成相應(yīng)的指令消息,因而速度相對較慢。MCISendString()函數(shù)使用的語法如下:
MCIERRORMCISendString(LPCTSTRMCICommand,LPCTSTRReturnInfo,UINTInfoBufferLength,HANDLECallbackWindow);
MCICommand:MCI控制命令,是以NULL結(jié)尾的字符串。如open,close,play,save。
ReturnInfo:字符串緩沖區(qū)指針,用來接受返回信息,如果沒有返回信息則被置為NULL。
InfoBufferLength:返回信息緩沖區(qū)長度。
CallbackWindow:通知信息窗口句柄。
MCISendString()函數(shù)發(fā)送MCI命令到MCI設(shè)備,MCI設(shè)備成功執(zhí)行MCI命令返回UNLL,否則返回錯誤代碼。
3、MCIGetErrorString()是對返回的錯誤信息代碼進行描述。使用語法如下:
BOOLMCIGetErrorString(DWORDfdwError,LPCTSTRlpszErrorText,UINTcchErrorText);
fdwError:由fdwError函數(shù)返回的錯誤代碼。
lpszErrorText:用來接受錯誤代碼描述的由NULL結(jié)尾的字符串指針。
cchErrorText:lpszErrorText字符串的長度。
如果成功則返回NULL,否則,表示錯誤代碼無法描述。
4、MCIGetDeviceID()返回一個已打開設(shè)備的ID號。其使用語法為:
MCIDEVICEIDMCIGetDeviceID(LPCTSTRlpszDevice);
LPszDevice:用來指定打開MCI設(shè)備的設(shè)備名。
函數(shù)調(diào)用成功,則返回該設(shè)備的標(biāo)識號,否則,返回空值。
5、MCIExecute()是VisualC提供的調(diào)用MCI指令的函數(shù),MCIExecute()的函數(shù)格式為:MCIExecute("..."),其中引號內(nèi)即MCI指令部分。這里我們根據(jù)怎么利用MCI指令控制視頻卡采集視頻信號,介紹MCIExecute()調(diào)用MCI的六條指令,它們分別是:
openoverlayaliasvideo:打開視頻混疊設(shè)備
windowvideostateshow:視頻窗口顯示
freezevideo:禁止采集視頻進入視頻緩沖器
unfreezevideosavevideofilename:允許幀緩沖器獲得視頻數(shù)據(jù)
savevideofilename:將視頻緩沖器內(nèi)容存入磁盤文件
closevideo:關(guān)閉視頻混疊設(shè)備
其中,video是打開視頻混疊設(shè)備時取的別名,打開后,對視頻混疊設(shè)備均以該別名進行標(biāo)識,該別名也可以由其他名字代替,或不用別名而直接用overlay來標(biāo)識。
下面給出利用MCI函數(shù)實現(xiàn)CD的幾種基本操作的程序代碼。
(1)打開CD音頻設(shè)備
采用消息命令通過MciSendCommand()函數(shù)打開一個CD音頻設(shè)備。
MCI_OPEN_PARMSOpenP;
OpenP.lpstrDeviceType=(LPCSTR)MCI_DEVITYPE_CD_AUDIO;
OpenP.wDeviceID=0;
DWORDDflag=MciSendCommand(UNLL,MCI_WAIT|MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_SHAREEABLE,&OpenP;);
MCI_OPEN表示為發(fā)送打開命令;MCI_OPEN_TYPE表示在OpenP.lpstrElementName中指定了文件的類型,調(diào)用指定打開一個CD音頻設(shè)備,MCI_DEVITYPE_CD_AUDIO是CD設(shè)備的代號。函數(shù)調(diào)用結(jié)束,在OpenP.wDeviceID中返回了打開設(shè)備的設(shè)備標(biāo)識號(ID號)。
(2)播放CD音頻設(shè)備
采用MCI命令消息播放CD音頻,可以靈活地對波形音頻播放進行控制方式,具體的控制方式可以通過dwFlags標(biāo)識給定。
MCI_PLAY_PARMSplayParms;
PlayParms.dwFrom=MIC_MAKE_TMSF(0,0,0);
MciSendCommand(m_wDeviceID,MCI_PLAY,MCI_FROM,(DWORD)(LPVOID)&playParms;);
通過向設(shè)備發(fā)送MCI_PLAY可以打開CD音頻設(shè)備。MCI_MAKE_TMSF宏把0分、0秒、0幀的初始時間轉(zhuǎn)換為dwFrom格式,該程序代碼使設(shè)備從0位置開始播放。
(3)關(guān)閉CD音頻設(shè)備
MciSendCommand(m_wDeviceID,MCI_STOP,UNLL,UNLL);
Dflag=MciSendCommand(m_wDeviceID,MCI_CLOSE,MCI_WAIT,NULL);
關(guān)閉CD音頻之前首先要發(fā)送MCI_WAIT標(biāo)識表示關(guān)閉設(shè)備之后函數(shù)才返回。
(作者單位:廣西區(qū)交通廳征費稽查局微機辦)