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