MCI音频制作录音机程序的总结

这段时间用MCI做了录音机的程序,下面进行一下总结,积累开发经验。

一、关于使用mci的方法

MCI(Media Control Interface,媒体控制接口)向Windows程序提供了在高层次上控制媒体设备接口的能力。总的来说,MCI操作十分简单,提供了十分强大的接口和操作。

一般使用MCI可以有以下几种方法

1 mciSendString 这种方法操作十分简便

比如播放只需要

mciSendstring("open 文件名称 alias aa");//aa是设备id

mciSendstring("play aa wait");

缺点也是显而易见的,操作太简单,不便于控制,特别是播放的时候 加入wait后,应用程序的句柄会失去响应。难以控制。(如果有高手找到了能控制的好方法也请告诉我)

2 mciSendCommand

看了MSDN 超级复杂,但是功能强大

3 用vfw

笔者采用的方法!

VFW(Video for Windows)

Microsoft公司开发的Windows环境下视频服务软件或视窗软件VFW,是目前在MPC中较为流行的视频处理软件。它使MPC具有播放和处理数字视频的能力,而无需增加专门的硬件设备。VFW是一个功能齐全的视频、图像和音频数据的采集、编辑、控制和处理的工具软件组。由于音频、图像、视频的采集和编辑都有其专门的软件,因此,VFW程序组中使用最广的是媒体播放器(MediaPlayer)。

vfw封装了一包很好用的函数

一般只需要MCIWndCreate 之后 在 MCIWndOpen 就可以了

举例

打开文件,创建句柄:

HWND m_Audio   = MCIWndCreate(this->m_hWnd,::AfxGetApp()->m_hInstance,WS_CAPTION,m_FilePath);

播放文件:

   MCIWndPlay(m_Audio);

停止播放:

MCIWndStop(m_Audio);

录制文件:

这个遇到点小麻烦 msdn记载上 直接MCIWndRecord就可以了,但是我使用时候总是出现文件错误,经过多方查证 需要先分配内存,才能录制

   MCIWndNew(m_Audio,"waveaudio");//分配内存

   MCIWndRecord(m_Audio);//开始录制

二、关于界面设计

录音,播放的时候都需要有一个进度条来显示当前进度

CSlider 就是这个控件。

由于我们这里只是要他显示当前进度,所以不需要进行buddy绑定

1 在得到文件信息后

需要SetRange() 以设置最小值和最大值

其中最小值为0 最大值用MCIWndGetLength获得(返回的是一个long值 存储毫秒数)

2 设置当前位置

开始播放后需要设置一个timer

wm_ontimer消息中,检查当前进度用setpos设置cslider的进度(当然还要有个存储变量记录当前进度)

     m_Timer += 100;   //存储进度的变量
     char buf[20];
     sprintf(buf,"%.1lf/%.1f秒",m_Timer/1000,m_MediaLength/1000);
     ((CStatic *)GetDlgItem(IDC_STATIC_MEDIALEN))->SetWindowText(buf);   //设置static上显示的值
     m_Slider.SetPos((int)m_Timer);   //设置slider

当进度大于length后,就调用MCIWndStop停止即可

大体思路就是这个样子

三 恶心的存盘

由于封装或者什么其他的原因 vfw的存盘极端恶心,我用MCIWndSave几次 都是乱码

最后参考了一位仁兄的做法 先存入一个a文件(注意 由于是unicode只有单个字母的文件名不会有乱码)然后FileCopy 再关闭MCI 再拷贝到要存盘的文件 再删除a......

Leave a Reply

Your email address will not be published. Required fields are marked *