頭檔案
#include <mmsystem.h>
函式原型簡介
mciSendString(傳送命令串),
函式原型為:
MCIERROR mciSendString( // 出錯返回非零值(
錯誤代碼)
// 可用mciGetErrorString獲得錯誤的文本描述
LPCTSTR lpszCommand, // 指向以null結尾的命令字元串:”命令 設備[ 參數]”
LPTSTR lpszReturnString,// 指向接收返回信息的緩衝區,為NULL時不返回信息
UINT cchReturn, // 上述緩衝區的大小
HANDLE hwndCallback // 在命令串中含notify時,它指定一個
回調視窗的句柄
// 一般為NULL
);
如:mciSendString(L"open sample.wav type waveaudio alias wave", NULL, 0, NULL);
MCI函式中還有一個只適用於命令串接口的函式為mciExcute,mciExcute(執行)是mciSendString的簡化形式:
BOOL mciExcute(LPCTSTR lpszCommand); // 成功返回TRUE
該函式只有Win16支持,Win32不支持,可自寫一函式實現:
BOOL
mciExcute(LPCTSTR lpszCommand) {
if (mciSendString(lpszCommand, NULL, 0, NULL)) return FALSE;
return TRUE;
}
如:mciExcute(L"open sample.wav type waveaudio alias wave");
官方文檔
The mciSendString function sends a command string to an MCI device. The device that the command is sent to is specified in the command string. (這個mciSendString函式傳送一個指令字元串到一個MCI設備, 指令傳送的設備在這個指令字元串中被指定.)
更多信息, 請參照微軟官方文檔.
函式原型
MCIERROR mciSendString( LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
差異比較
mciSendString與mciExecute都是常用的執行MCI指令的函式, 在使用mciSendString執行時, 如若遇到異常, 僅會返回一個錯誤碼, 而mciExecute還會彈出一個視窗.
所以, mciSendString常用於程式的最終發布版本, mciExecute由於會彈出視窗, 所以很少在發布版本中使用, 反而在調試版本中常用, 因為彈出視窗中會包含錯誤信息, 易於調試.
使用方法
簡略概述
mciSendString是用來播放
多媒體檔案的API指令,可以播放
MPEG,AVI,WAV,MP3,等等,下面我們來介紹一下它的使用方法:
一,打開多媒體檔案。
首先在Dialog上面放一個Picture控制項,MCISendString就在這個Picture控制項的平面上播放多媒體檔案,
設Picture控制項的ID為IDC_STATIC1:
CString open1;
char buf[256];
open1.Format("open f:\\mpeg\\mpeg1.avi type MPEGVideo Alias movie parent %u Style %u notify", h,WS_CHILD);
mciSendString(open1.GetBuffer(open1.GetLength()),buf,sizeof(buf),NULL);
這樣F盤下面的mpeg目錄下的mpeg1.avi就打開了,其中的type MPEGVideo是指打開
MPEG,AVI等類型,如果不加type MPEGVideo這一句,就是打開WAV,MP3等,Alias movie定義了mpeg1.avi的別名為movie,以後可以通過操作movie就可以操作mpeg1.avi。
上面我們已經打開了f:"mpeg"mpeg1.avi,現在我們來播放它:
mciSendString("play movie",buf,sizeof(buf),NULL);
如果想全螢幕播放:
mciSendString("play movie fullscreen",buf,sizeof(buf),NULL);
三,暫停播放。
mciSendString("pause movie",buf,sizeof(buf),NULL);
四,停止播放。
mciSendString("close movie",buf,sizeof(buf),NULL);
五,得到所播放檔案的長度。
char sPosition[256];long lLength;
mciSendString("Status movie length", sPosition, 255,0);lLength=
strtol(sPosition, NULL, 10);
其中lLength就是所播放檔案的長度。注意:該長度單位是毫秒。
六,得到所播放檔案的聲音大小。
char chVolume[256];long lVolume;
mciSendString("status movie volume",chVolume,255,0);lVolume=strtol(chVolume,NULL,10);其中lVolume就是所播放檔案的聲音大小。
七,到你指定的位置播放。
CString step1;long lPosition;
lPosition=100;
step1.Format("seek movie to %ld",lPosition);
mciSendString(step1.GetBuffer(step1.GetLength()),buf,sizeof(buf),0);
其中lPosition就是要到的播放位置,可以由你指定。
詳細內容
參考文章: mciSendString 和 mciSendCommand 函式的簡單使用
程式示例
命令串
1)CD
MCIERROR err = mciSendString(L"open cdaudio alias cd", NULL, 0, NULL); // 打開CD
if (err) {
if (mciGetErrorString(err, buf, 256))
return;
}
mciSendString(L"status cd number of tracks", buf, 256, NULL); // 獲得音軌總數
m_nTracks = wcstol(buf, NULL, 10); // 這裡使用了
寬字元版的字元串到整數的
//
轉換函式:long wcstol( const
wchar_t *nptr, wchar_t **endptr, int base );
wsprintf(buf, L"play cd from %d to %d", m_nFrom, m_nTo);
mciSendString(buf, NULL, 0, NULL); // 從音軌m_nFrom頭播放到音軌m_nTo–1尾
其他常用命令:
mciSendString(L"set cd time format tmsf", NULL,0,NULL); // 設定時間格式為
// 軌(<100):分(<100):秒(<60):幀(<75),一秒=75塊,一塊=98幀
mciSendString(L"set cd door open", NULL, 0, NULL); // 打開光碟機
mciSendString(L"set cd door closed", NULL, 0, NULL); // 關閉光碟機
mciSendString(L"pause cd", NULL, 0, NULL); // 暫停播放
mciSendString(L"resume cd", NULL, 0, NULL); // 恢復播放
mciSendString(L"stop cd", NULL, 0, NULL); // 停止播放
mciSendString(L"close cd", NULL, 0, NULL); // 關閉CD設備
mciSendString(L"status cd length", buf, 256, NULL); // 獲得整個CD的音軌總長度
mciSendString(L"status cd length track 5", buf, 256, NULL); // 獲得第5個音軌的長度
mciSendString(L"status cd current track", buf, 256, NULL); // 獲得當前
音軌號注意:
"play cd from m_nFrom to m_nTo"是完整形式,它還有其他形式:
"play cd from m_nFrom"從m_nFrom播放到盤尾
"play cd to m_nTo"從當前位置播放到指定音軌
"play cd" 從當前位置播放到盤尾
例如播放最後一首歌:"play cd from m_nLast"
2)WAV
wsprintf(buf, L"open \"%s\" alias sound type waveaudio", pDoc->strFilePath);
MCIERROR err = mciSendString(buf, NULL, 0, NULL);
if (err) {
if (mciGetErrorString(err, buf, 256)) MessageBox(buf, L“Error”);
return;
}
// t1和t2為用戶指定的起止時間(單位為秒,浮點變數)
DWORD start = (
DWORD)(t1 * 1000 + 0.5), end = (DWORD)(t2 * 1000 + 0.5);
wsprintf(buf, L"play sound from %ld to %ld", start, end);
mciSendString(buf, NULL, 0, NULL);
其他常用命令:
mciSendString(L"status sound length", buf, 256, NULL);
mciSendString(L"pause sound", NULL, 0, NULL);
mciSendString(L"play sound", NULL, 0, NULL); // 從當前位置播放到檔案尾
mciSendString(L"stop sound", NULL, 0, NULL);
mciSendString(L"close sound", NULL, 0, NULL);
3).MP3
下面看一個播放mp3音樂的簡單示例:
#include<Windows.h>
#include<mmsystem.h>
#pragma comment(lib,"WINMM.LIB")
int main(int argc,char*argv[])
{
mciSendString(TEXT("open 難忘的一天.mp3 alias mysong"),NULL,0,NULL);
mciSendString(TEXT("play MySong"),NULL,0,NULL);
Sleep(50000);
return0;
}
該函式還可以播放avi視頻等。