您的当前位置:首页正文

基于Visual C++声音文件操作(自己编写MP3播放器)

2023-06-24 来源:个人技术集锦
基于Visual C++6.0的声音文件操作——写自己的播放器

三、声音文件的声音数据的读取操作

操作声音文件,也就是将WAVE文件打开,获取其中的声音数据,根据所需要的声音数据处理算法,进行相应的数学运算,然后将结果重新存储与WAVE格式的文件中去。可以使用CFILE类来实现读取操作,也可以使用另外一种方法,拿就是使用Windows提供的多媒体处理函数(这些函数都以mmino打头)。这里就介绍如何使用这些相关的函数来获取声音文件的数据,至于如何进行处理,那要根据你的目的来选择不同的算法了。WAVE文件的操作流程如下:

1.调用mminoOpen函数来打开WAVE文件,获取HMMIO类型的文件句柄;

2.根据WAVE文件的结构,调用mmioRead、mmioWrite和mmioSeek函数实现文件的读、写和定位操作;

3.调用mmioClose函数来关闭WAVE文件。

下面的函数代码就是根据WAVE文件的格式,实现了读取双声道立体声数据,但是在使用下面的代码过程中,注意需要在程序中链接Winmm.lib库,并且包含头文件\"Mmsystem.h\"。 BYTE * GetData(Cstring *pString) //获取声音文件数据的函数,pString参数指向要打开的声音文件; {

if (pString==NULL) return NULL;

HMMIO file1;//定义HMMIO文件句柄;

file1=mmioOpen((LPSTR)pString,NULL,MMIO_READWRITE);//以读写模式打开所给的WAVE文件; if(file1==NULL) {

MessageBox(\"WAVE文件打开失败!\"); Return NULL; }

char style[4];//定义一个四字节的数据,用来存放文件的类型; mmioSeek(file1,8,SEEK_SET);//定位到WAVE文件的类型位置 mmioRead(file1,style,4);

if(style[0]!='W'||style[1]!='A'||style[2]!='V'||style[3]!='E')//判断该文件是否为\"WAVE\"文件格式 {

MessageBox(\"该文件不是WAVE格式的文件!\"); Return NULL; }

PCMWAVEFORMAT format; //定义PCMWAVEFORMAT结构对象,用来判断WAVE文件格式; mmioSeek(file1,20,SEEK_SET);

//对打开的文件进行定位,此时指向WAVE文件的PCMWAVEFORMAT结构的数据;

mmioRead(file1,(char*)&format,sizeof(PCMWAVEFORMAT));//获取该结构的数据;

if(format.wf.nChannels!=2)//判断是否是立体声声音; {

MessageBox(\"该声音文件不是双通道立体声文件\");

return NULL; }

mmioSeek(file1,24+sizeof(PCMWAVEFORMAT),SEEK_SET); //获取WAVE文件的声音数据的大小; long size;

mmioRead(file1,(char*)&size,4); BYTE *pData;

pData=(BYTE*)new char[size];//根据数据的大小申请缓冲区;

mmioSeek(file1,28+sizeof(PCMWAVEFORMAT),SEEK_SET);//对文件重新定位;

mmioRead(file1,(char*)pData,size);//读取声音数据; mmioClose(file1, MMIO_FHOPEN);//关闭WAVE文件; return pData; }

四、使用MCI方法操作声音文件

WAVE声音文件一个最基本的操作就是将文件中的声音数据播放出来,用Windows提供的API函数BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound)可以实现小型WAV文件的播放,其中参数lpszSound 为所要播放的声音文件,fuSound为播放声音文件时所用的标志位。例如实现Sound.wav 文件的异步播放,只要调用函数

sndPlaySound(\"c:\\windows\\Sound.wav\就可以了,由此可以看到sndPlaySound函数使用是很简单的。但是当WAVE文件大于100K时,

这时候系统无法将声音数据一次性的读入内存,sndPlaySound函数就不能进行播放了。为了解决这个问题,你的一个选择就是用MCI方法来操作声音文件了。在使用MCI方法之前,首先需要在你开发的项目设置

Project->Setting->Link->Object/library modules中加入winmm.lib。并在头文件中包括\"mmsystem.h\"头文件。

MicroSoft API提供了MCI(The Media Control Interface)的方法mciSendCommand()和mciSendString()来完成WAVE文件的播放,这里仅介绍mciSendCommand()函数的使用。

原型:DWORD mciSendCommand(UINT wDeviceID,UINT wMessage,DWORD dwParam1,DWORD dwParam2);

参数:wDeviceID:接受消息的设备ID;

Message:MCI命令消息;

wParam1:命令的标志位;

wParam2:所使用参数块的指针

返值:调用成功,返回零;否则,返回双字中的低字存放有错误信息。

在使用MCI播放声音文件时,首先要打开音频设备,为此要定义MCI_OPEN_PARMS变量 OpenParms,并设置该结构的相应分量: OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_WAVEFORM_AUDIO;//WAVE类型

OpenParms.lpstrElementName = (LPCSTR) Filename;//打开的声音文件名;

OpenParms.wDeviceID = 0;//打开的音频设备的ID

mciSendCommand (NULL, MCI_OPEN,MCI_WAIT |

MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT, (DWORD)(LPVOID) &OpenParms)函数调用发送MCI_OPEN命令后,返回的参数 OpenParms中成员变量的wDeviceID指明打开了哪个设备。需要关闭音频设备时只要调用mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL)就可以了。

播放WAVE文件时,需要定义MCI_PLAY_PARMS变量PlayParms,对该变量进行如下设置:PlayParms.dwFrom = 0,这是为了指定从什么地方(时间)播放WAVE文件,设置好以后,调用函数mciSendCommand (m_wDeviceID, MCI_PLAY,MCI_FROM,

(DWORD)(LPVOID)&PlayParms));就实现了WAVE声音文件的播放。

另外,调用mciSendCommand (m_wDeviceID, MCI_PAUSE, 0,(DWORD)(LPVOID)&PlayParms)实现了暂停功能。调用

mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL)实现停止功能等,可以看出,这些不同的功能实现都是依靠参数\"Message\"取不同的值来实现的。 不同的Message和dwParam1、dwParam2的组合还可以实现文件的 跳跃功能。如下面的代码实现了跳转到WAVE文件末端的操作:mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_END,

NULL)。

下面的代码实现了WAVE声音文件的播放:

void CTest1View::OnMciPlayWave() {

// TODO: Add your command handler code here MCI_OPEN_PARMS mciOpenParms; MCI_PLAY_PARMS PlayParms; mciOpenParms.dwCallback=0;

mciOpenParms.lpstrElementName=\"d:\\\\chimes.wav\"; mciOpenParms.wDeviceID=0;

mciOpenParms.lpstrDeviceType=\"waveaudio\"; mciOpenParms.lpstrAlias=\" \"; PlayParms.dwCallback=0; PlayParms.dwTo=0; PlayParms.dwFrom=0;

mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);//打开音频设备; mciSendCommand(mciOpenParms.wDeviceID,MCI_PLAY,MCI_WAIT,(DWORD)(LPVOID)&PlayParms);//播放WAVE声音文件;

mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,NULL,NULL);//关闭音频设备; }

上一页 1 2 3 下一页

【责任编辑:方舟】

【发表评论】【关闭窗口】

■ 相关内容

基于Visual C++6.0的DDL编程实现 Visual C++窗体设计技巧集 Visual C++实现Flash动画播放 Visual C++编程控制输入法 Visual C++利用多线程模拟并行计算

Visual C++编程疑难问题解(一) 基于Visual C++的Winsock API研究 Visual C++实现数字图像增强处理 Visual C++模态对话框消息处理机制的分析 Visual C++.NET中的字符串转换方法 Visual C++常微分方程初值问题求解 Visual C++多媒体及图形、图像处理

感谢访问天极网,如果您觉得该文章涉及版权问题,请看这里!

因篇幅问题不能全部显示,请点此查看更多更全内容