VC++播放音频文件和音频数据的方法
来源:互联网 发布:淘宝客服招聘靠谱吗 编辑:程序博客网 时间:2024/06/05 03:15
转载自:http://www.cnblogs.com/margin1988/archive/2012/05/10/2493937.html
在程序中,很有可能会涉及到播放一些音频文件(比如:.wav文件)和音频数据,这个问题怎么解决呢?VC++中想要播放一个音频文件(.wav)是很容易的,只要调用WIndows API函数PlaySound()就可以了,但是,如果您想播放自己在程序中产生的一段音频数据,就不是那么简单了,需要利用WIndows wave I/O API的几个函数来实现。
下面结合实例来说明(完整实例可在我的CSDN资源中下载:http://download.csdn.net/detail/margin1988/3677328,该例子利用WIndows wave I/O API 函数,实现了播放自定义的一段音频数据(通过sin()函数产生);并且使用了PlaySound()函数播放“250.wav”文件):
1 //需包含的头文件2 #include <MMSystem.h>3 #pragma comment(lib,"winmm.lib")4 //PlaySound()函数和其他WIndows wave I/O API 函数的使用5 #include "math.h"//sin()函数的使用
1.播放文件:
1 CString path;2 path.Format("%s250.wav",g_BasePath);3 //g_BasePath的取值不用多说,前面已详细介绍了。4 PlaySound(_T(path),0,SND_FILENAME|SND_ASYNC);
2.播放数据:
(1)确定音频数据的格式及内容:
1 int rate=1000; //刺激率 2 int sampleRate = 44100; //采样率 3 const int NUMPTS = (int) (44100 * 0.5); // 0.5s 4 short int waveOut[NUMPTS];//音频数据 5 6 //内容 7 for (int i=0;i<NUMPTS;i++) 8 { 9 waveOut[i] = (short int)ceil(sin(2*3.1415926*rate*i/sampleRate)*20000);10 }11 //格式12 WAVEFORMATEX pFormat;13 pFormat.wFormatTag=WAVE_FORMAT_PCM; 14 //simple,uncompressed format15 pFormat.nChannels=1;//1=mono, 2=stereo16 pFormat.nSamplesPerSec=sampleRate; // 4410017 pFormat.nAvgBytesPerSec=sampleRate*2;18 // = nSamplesPerSec * n.Channels * wBitsPerSample/819 pFormat.nBlockAlign=2; // = n.Channels * wBitsPerSample/820 pFormat.wBitsPerSample=16;21 //16 for high quality, 8 for telephone-grade22 pFormat.cbSize=0;
2)打开一个给定的波形音频输出装置:
1 HWAVEOUT hWaveOut;2 WAVEHDR WaveOutHdr;3 MMRESULT result;4 result = waveOutOpen(&hWaveOut, WAVE_MAPPER,&pFormat,0L, 0L, WAVE_FORMAT_DIRECT);5 if (result)6 {7 MessageBox(_T("Failed to open waveform output device."));8 return;9 }
(3)准备波形数据块:
1 WaveOutHdr.lpData = (LPSTR)waveOut;2 WaveOutHdr.dwBufferLength = NUMPTS*2;3 WaveOutHdr.dwBytesRecorded=0;4 WaveOutHdr.dwUser = 0L;5 WaveOutHdr.dwFlags = 0L;6 WaveOutHdr.dwLoops = 0L;7 waveOutPrepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR));
(4)向给定音频媒体中输出波形数据块:
1 result = waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR));2 if (result)3 {4 MessageBox(_T("Failed to play sound"));5 return;6 }
(5)清除准备:
1 // Wait until finished sound play2 do {} while (waveOutUnprepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR))==WAVERR_STILLPLAYING);
(6)关闭给定音频媒体:
1 waveOutClose(hWaveOut);
0 0
- VC++播放音频文件和音频数据的方法
- VC++播放音频文件和音频数据的方法
- VC++播放音频的简单方法
- VC++播放音频的简单方法
- VC++播放音频的简单方法 收藏
- 音频(三) - 录制播放PCM音频流和WMV音频文件
- iPhone上的OpenAL音频 可播放音频流 音频文件
- iPhone上的OpenAL音频 可播放音频流 音频文件
- VC播放音频文件
- VC:中播放音频文件
- Android音频文件浏览+音频播放
- 使用音频引擎MITA播放缓冲的音频文件的源代码
- 使用音频引擎MITA二进制静态播放音频文件的源代码
- 音频的播放方法
- android实现音频文件播放的方法
- html/Javascript播放WAV音频文件的方法
- VC++中MCI播放音频文件
- VC++中MCI播放音频文件
- RasGetNapStatus
- nodejs 3种守护进程使用说明forever/PM2/
- 湖南省赛 有向无环图 水dp
- 计算机语言发展史及Java语言简介
- java之helloworld
- VC++播放音频文件和音频数据的方法
- 关于qt中的辐射渐变的使用 QRadialGradient
- java线程池的种类和应用
- ListView的分页加载与图文混排以及ExpandableListView的使用
- create table table_name as ...
- hihocoder
- Lightoj1189——Sum of Factorials(阶乘的和+贪心)
- 基于科大讯飞语音云windows平台开发
- Qt中使用正则表达式时'.'的转义字符不是'\.'