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