这段时间用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......