使用MCI API,源文件中需要包含头文件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库 Winmm.lib。 VS2008在源文件加上#include "mmsystem.h" #pragma comment(lib,"winmm.lib")

1、MCI简介

MCI(Media Control Interface,媒体控制接口)向Windows程序提供了在高层次上控制媒体设备接口的能力。程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。

对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。

比如,对于play,视盘机和CD机有不同的反应(一个是播放视频,一个播放音频),而对用户来说却只需要按同一按钮。

应用程序通过向MCI发送命令来控制媒体设备。MCI命令接口分命令字符串和命令消息两种,两者具有相同的功能。命令字符串具有使用简单的特点,但是它的执行效率不如命令消息。

所有的MCI命令字符串都是通过多媒体API函数mciSendString传递给MCI的,该函数的声明为:

MCIERROR mciSendString(

LPCTSTR lpszCommand,    //MCI命令字符串

LPTSTR lpszReturnString, //存放反馈信息的缓冲区

UINT  cchReturn,     //缓冲区的长度

HANDLE hwndCallback    //回调窗口的句柄,一般为NULL

); //若成功则返回0,否则返回错误码。

该函数返回的错误码可以用mciGetErrorString函数进行分析,该函数的声明为:

BOOL mciGetErrorString(

DWORD fdwError,   //函数mciSendString返回的错误码

LPTSTR lpszErrorText, //接收描述错误的字符串的缓冲区

UINT  cchErrorText  //缓冲区的长度

);

下面是使用mciSendString函数的一个简单例子:

char buf[50];

MCIERROR mciError;

mciError=mciSendString("open cdaudio",buf,strlen(buf),NULL);

if(mciError)

{

mciGetErrorString(mciError,buf,strlen(buf));

AfxMessageBox(buf);

return;

}

open cdaudio命令打开CD播放器,如果出错(如驱动器内没有CD)则返回错误码,此时可以用mciGetErrorString函数取得错误信息字符串。

2、MCI设备

open是MCI打开设备的命令,cdaudio是MCI设备名。MCI的设备类型如下:

animation  动画设备

cdaudio   CD播放器

dat     数字音频磁带机

digitalvideo 某一窗口中的数字视频(不基于GDI)

other    未定义的MCI设备

overlay   重叠设备(窗口中的模拟视频)

scanner   图象扫描仪

sequencer  MIDI序列器

videodisc  视盘机

waveaudio  播放数字波形文件的音频设备

设备名是在注册表或SYSTEM.INI的[mci]部分定义的,典型的[mci]段如下:

[mci]

cdaudio=mcicda.drv

sequencer=mciseq.drv

waveaudio=mciwave.drv

avivideo=mciavi.drv

videodisc=mcipionr.drv

等号的左边是设备名,右边是对应的MCI驱动程序。当安装了新的MCI驱动程序时,系统要用不同的设备名来区分。

3、MCI命令

使用MCI设备一般包括打开、使用和关闭三个过程,常用的MCI命令有:

open    打开设备

close    关闭设备

play    开始设备播放

stop    停止设备的播放或记录

record   开始记录

save    保存设备内容

pause    暂停设备的播放或记录

resume   恢复暂停播放或记录的设备

seek    改变媒体的当前位置

capacility 查询设备能力

info    查询设备的信息

status   查询设备状态信息

MCI的大部分命令可以控制不同的媒体设备,但其中record和save命令并不是所有MCI设备都可以使用。

MCI命令的使用是很随意的,只要先打开,最后关闭,中间可以随意调用各种命令。

(1) open 打开设备

MCI设备使用前必须先打开,当然,使用后也必须要关闭,以免影响他人的使用。

open device_name type device_type alias device_alias

device_name     要使用的设备名,通常是文件名。

type device_type  设备类型,例如waveaudio或sequencer,可省略。

alias device_alias 设备别名,指定后可在其他命令中代替设备名。

(2) play 开始设备播放

MCI设备打开后即可以播放,可使用设备名或别名。

play device_alias from pos1 to pos2 wait repeat

若省略from则从当前磁道开始播放,若省略to则播放到结束。

若指明wait则等到播放完毕命令才返回。

若指明repeat则会不停的重复播放。

若同时指明wait和repeat则命令不会返回,本线程产生堵塞,通常会引起程序失去响应。

(3) 播放CD

void CTttView::OnOpenCD()

{

mciSendString("open cdaudio",NULL,0,NULL);

mciSendString("play cdaudio",NULL,0,NULL);

);

void CTttView::OnStopCD()

{

mciSendString("stop cdaudio",NULL,0,NULL);

mciSendString("close cdaudio",NULL,0,NULL);

);

还可以:

pause cdaudio  暂停播放。

resume cdaudio 继续被暂停的播放。

seek cdaudio to  移动到指定磁道。

set cdaudio door open/closed 弹出或缩进CD盘。

(4) 播放多媒体文件

void CTttView::OnMyMenu()

{

mciSendString("open myfolder\\tada.wav alias aa",NULL,0,NULL);

或 mciSendString("open myfolder\\flourish.mid alias aa",NULL,0,NULL);

或 mciSendString("open myfolder\\clock.avi alias aa",NULL,0,NULL);

mciSendString("play aa wait",NULL,0,NULL);

mciSendString("close aa",NULL,0,m_hWnd);

);

(5) 录制声音

void CTttView::OnStartRecord()

{

mciSendString("open new type waveaudio alias aa",NULL,0,NULL);

mciSendString("record aa",NULL,0,NULL);

);

void CTttView::OnStopRecord()

{

mciSendString("save aa c:\\aaa.wav wait",NULL,0,NULL);

mciSendString("close aa",NULL,0,NULL);

);

4、MCI命令消息

到目前为止,我们使用的都是MCI命令字符串。可以发现,命令字符串具有简单易学的优点,但这种接口与C/C++的风格相去甚远,如果程序要查询和设置大量数据,那么用字符串的形式将很不方便。

MCI的命令消息接口提供了C语言接口,它速度更快,并且更能符合C/C++程序员的需要。

所有MCI命令消息都是通过mciSendCommand函数发送的,函数声明为:

MCIERROR mciSendCommand(

MCIDEVICEID wIDDevice,  //设备的ID,在打开设备时不用该参数

UINT    uMsg,    //命令消息

DWORD    fdwCommand, //命令消息的标志

DWORD    dwParam   //指向包含命令消息参数的结构

); //若成功则返回0,否则返回错误码

命令消息uMsg与命令字符串是对应的,例如,open与MCI_OPEN完成的是一样的功能。

变量wDeviceID用来保存设备的ID,系统用ID来标识不同的设备,以保证命令发给正确的对象。

void CTttView::OnMyMenu()

{

MCI_OPEN_PARMS mciOpen;

UINT wDeviceID;

mciOpen.lpstrDeviceType = "avivideo";

mciOpen.lpstrElementName = "myfolder\\clock.avi";

mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);

wDeviceID=mciOpen.wDeviceID;

MCI_PLAY_PARMS mciPlay;

mciSendCommand(wDeviceID, MCI_PLAY, MCI_WAIT, (DWORD)&mciPlay);

);

可以看出,用命令消息比用命令字符串要复杂的多,但它的执行效率高。

c语言mcisendstring函数,mciSendString用法相关推荐

  1. php函数find的用法,c语言find函数的用法详解

    c语言find函数的用法详解 C语言之find()函数 find函数用于查找数组中的某一个指定元素的位置. 比如:有一个数组[0, 0, 5, 4, 4]: 问:元素5的在什么位置,find函数 返回 ...

  2. C语言“fread”函数的用法?

    C语言"fread"函数的用法为"size_tf read(void *buffer,size_t size,size_t count,FILE *stream)&quo ...

  3. linux之getcwd函数解析,Linux 中C语言getcwd()函数的用法

    Linux 中C语言getcwd()函数的用法 先来看该函数的声明: #include char *getcwd(char *buf,size_t size); 介绍: 参数说明:getcwd()会将 ...

  4. c语言get()的作用,c语言get函数的用法有哪些

    C语言中gets从标准输入设备读字符串函数,可以无限读取,不会判断上限,今天学习啦小编在这里为大家介绍C语言get函数的用法,欢迎大家阅读! c语言get函数的用法:int getc(FILE *st ...

  5. R语言 diag函数的用法

    R语言 diag函数的用法 我们今天写一下关于R语言中diag函数的用法: (1)diag函数可以用来提取矩阵的对角元素,并将它保存成向量的格式.值得注意的是,如果所要提取的矩阵不是方阵的话,diag ...

  6. C语言 strstr函数的用法及模拟实现strstr函数

    C语言 strstr函数的用法及模拟实现strstr函数 一.strstr函数的用法 二.模拟实现strstr函数的功能 一.strstr函数的用法 1.strstr函数原型:char* strstr ...

  7. 计算机科学类专升本复习之“C语言fopen函数的用法”详解(初稿)

    C语言fopen函数的用法,C语言打开文件详解 在C语言中,"操作文件" 之前 必须 先"打开文件"; 所谓"打开文件",就是让 " ...

  8. c语言fread函数,C语言“fread”函数的用法?

    C语言"fread"函数的用法? C语言"fread"函数的用法为"size_tf read(void *buffer,size_t size,siz ...

  9. c语言memcpy是什么,C语言memcpy函数的用法

    介绍 memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下: void *memcpy(void *dest, const void *sr ...

  10. C语言time()函数的用法

    文章目录 time()函数 1. time()函数的用途 2. time()函数的头文件 3. time()函数返回的数据类型 4. time()函数使用示例 localtime函数 例子1 例子2 ...

最新文章

  1. 从实体类get方法拿不到值,可能是字段带_的原因
  2. python中的字符串常用函数
  3. 自定义控件之onMeasure
  4. asp.net mvc 接入阿里大于 短信验证码发送
  5. ns3中调试程序------命令行、gdb和logging系统
  6. mysql 存储过程 is_Mysql存储过程语法问题...
  7. CSS揭秘(四)视觉效果
  8. oracle手动锁表和解锁_Oracle锁表查询和解锁方法
  9. windows10应用商店下安装kali子系统
  10. 理科生毕业,如何写论文,为论文降重
  11. 小糊涂家装预算软件 v8.0 怎么用
  12. [转]我的世界观(一)
  13. Chrome vimium 插件
  14. 全球首次互联网8K直播,阿里工程师如何实现?
  15. su su- sudo
  16. 服务器500系列错误解释
  17. cin.tie(NULL)--加速
  18. 一个BUG(缺陷)的生命周期
  19. Java 求解买卖股票时机含冷冻期
  20. 酒瓶中蜜蜂和苍蝇的故事

热门文章

  1. vue中使用codemirror
  2. 几道web前端练习题目
  3. React hook 中的数据获取
  4. XPath语法规则及实例
  5. bzoj4152: [AMPPZ2014]The Captain
  6. 如何加快Json 序列化?有哪些方法?
  7. maven2 + tomcat6 + eclipse集成配置
  8. HttpService远程校验
  9. php数据库中统计人数用什么方法,在PHP中处理用户统计信息的最佳方法是什么
  10. 随机森林和gbdt结合_决策树与迭代决策树(GBDT)