MCI(Media Control Interface)媒體控制接口是MircroSoft提供的一組多媒體設備和文件的標准接口,它的好處是可以方便地控制絕大多數多媒體設備包括音頻、視頻、影碟、錄像等多媒體設備,而不需要知道它們的內部工作狀況。但是古人雲:成也蕭何,敗也蕭何。MCI雖然看上去高大全,但對於一些高級應用來說,它是遠遠不夠的。
MCI的控制方式:
一般說來,程序員使用兩個函數就可以與MCI打交道了:
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
命令字符串方式,用接近於日常生活用語的方式發送控制命令,適用於高級編程如VB、TOOLBOOK等。
MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
命令消息方式,用專業語法發送控制消息,適用於VC等語言編程,此方式直接與MCI設備打交道。
對於mciSendCommand,第一個參數指定了設備標識,這個標識會在程序員打開MCI設備時由系統提供。第二個參數指定將如何控制設備,詳細請查閱後面“MCI指令”一欄。第三個參數為訪問標識,第四個參數一般是一個數據結構,標識程序在訪問MCI時要的一些信息。有關詳細資料,請查閱本光盤配套書。
對於mciSendString,第一個參數為一串控制字符串,返回信息由系統填入第二個參數,第三個參數指明返回信息的最大長度,若對MCI裝置設定了"notify"標志則需要在第四個參數填上返回窗口句柄。
舉例:
mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 關閉一個MCI設備
mciSendString("open aaa.avi", 0, 0, 0); // 打開文件"aaa.avi"
MCI的設備類型:
設備描述描述字符串說明
MCI_ALL_DEVICE_ID所有設備
MCI_DEVTYPE_ANIMATIONAnimation動畫設備
MCI_DEVTYPE_CD_AUDIOCdaudioCD音頻
MCI_DEVTYPE_DATDat數字音頻
MCI_DEVTYPE_DIGITAL_VIDEODigitalvideo數字視頻
MCI_DEVTYPE_OTHEROther未定義設備
MCI_DEVTYPE_OVERLAYOverlay重疊視頻
MCI_DEVTYPE_SCANNERScanner掃描儀
MCI_DEVTYPE_SEQUENCERSequencer MIDI序列器
MCI_DEVTYPE_VCRVcr合式錄像機
MCI_DEVTYPE_VIDEODISCVideodisc激光視盤
MCI_DEVTYPE_WAVEFORM_AUDIOwaveaudio Wave音頻
對於未在上面定義的MCI設備,用戶可查看system.ini文件中[mci]部分,例如:
[mci]
cdaudio=mcicda.drv
sequencer=mciseq.drv
waveaudio=mciwave.drv
avivideo=mciavi.drv
videodisc=mcipionr.drv
vcr=mcivisca.drv
ActiveMovie=mciqtz.drv
QTWVideo=mciqtw.drv
MPEGVideo=C:PROGRA~1XINGXINGMP~1xmdrv95.dll
其中最後兩句分別指明了Apple的QuickTime設備,設備名為"QTWVidio"、MPEG影像設備,設備名為"MPEGVideo"。
//------------------------------
// 廣告時間:
// 歡迎訪問 C++ Builder 研究 - http://www.ccrun.com
//------------------------------
在MCI編程中,既可以將設備描述當設備名,也可以將描述字符串當設備名,一個極端偷懶的辦法是程序員不要在程序中指定設備名,Windows將自動根據文件擴展名識別設備類型。
舉個例子來說,打開一個多媒體文件有以下三種方式:
[1]:自動識別:打開一個"WAV"文件
MCI_OPEN_PARMS mciOpen;
mciOpen.lpstrDeviceType = 0;
mciOpen.lpstrElementName = "aaa.wav";
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
[2]:指定設備描述:打開CD播放器
MCI_OPEN_PARMS mciOpen;
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
[3]:指定描述字符串: 打開一個AVI文件
MCI_OPEN_PARMS mciOpen;
mciOpen.lpstrDeviceType = "avivideo";
mciOpen.lpstrElementName = "aaa.avi";
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
注意三種打開方式中,函數第三個參數的區別,後面會講到這種區別。
MCI指令
MCI_BREAK設置中斷鍵,缺省是”CTRL+BREAK"
MCI_CAPTURE抓取當前幀並存入指定文件,僅用於數字視頻
MCI_CLOSE關閉設備
MCI_CONFIGURE彈出配置對話框,僅用於數字視頻
MCI_COPY拷貝數據至剪貼板
MCI_CUE延時播放或錄音
MCI_CUT刪除數據
MCI_DELETE刪除數據
MCI_ESCAPE僅用於激光視頻
MCI_FREEZE將顯示定格
MCI_GETDEVCAPS獲取設備信息
MCI_INDEX當前屏幕顯示與否,僅用於VCR設備
MCI_INFO獲取字符串信息
MCI_LIST獲取輸入設備數量,支持數字視頻和VCR設備
MCI_LOAD裝入一個文件
MCI_MARK取消或做一個記號,與MCI_SEEK配套
MCI_MARK取消或做一個記號,與MCI_SEEK配套
MCI_MONITOR為數字視頻指定報告設備
MCI_OPEN打開設備
MCI_PASTE粘帖數據
MCI_PAUSE暫停當前動作
MCI_PLAY播放
MCI_PUT設置源、目的和邊框矩形
MCI_QUALITY定義設備缺省質量
MCI_RECORD開始錄制
MCI_RESERVE分配硬盤空間
MCI_RESTORE拷貝一個bmp文件至幀緩沖
MCI_RESUME使一個暫停設備重新啟動
MCI_SAVE保存數據
MCI_SEEK更改媒體位置
MCI_SET設置設備信息
MCI_SETAUDIO設置音量
MCI_SETTIMECODE啟用或取消VCR設備的時間碼
MCI_SETTUNER設置VCR設備頻道
MCI_SETVIDEO設置video參數
MCI_SIGNAL在工作區上設置指定空間
MCI_STATUS獲取設備信息
MCI_STEP使播放設備跳幀
MCI_STOP停止播放
MCI_SYSINFO返回MCI設備信息
MCI_UNDO取消操作
MCI_UNFREEZE使使用MCI_UNFREEZE的視頻緩沖區恢復運動
MCI_UPDATE更新顯