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_ANIMATION Animation 動畫設備
MCI_DEVTYPE_CD_AUDIO Cdaudio CD音頻
MCI_DEVTYPE_DAT Dat 數字音頻
MCI_DEVTYPE_DIGITAL_VIDEO Digitalvideo 數字視頻
MCI_DEVTYPE_OTHER Other 未定義設備
MCI_DEVTYPE_OVERLAY Overlay 重疊視頻
MCI_DEVTYPE_SCANNER Scanner 掃描儀
MCI_DEVTYPE_SEQUENCER Sequencer MIDI 序列器
MCI_DEVTYPE_VCR Vcr 合式錄像機
MCI_DEVTYPE_VIDEODISC Videodisc 激光視盤
MCI_DEVTYPE_WAVEFORM_AUDIO waveaudio 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 &nb