博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++播放音频文件和音频数据的方法
阅读量:6114 次
发布时间:2019-06-21

本文共 3818 字,大约阅读时间需要 12 分钟。

在程序中,很有可能会涉及到播放一些音频文件(比如:.wav文件)和音频数据,这个问题怎么解决呢?VC++中想要播放一个音频文件(.wav)是很容易的,只要调用WIndows API函数PlaySound()就可以了,但是,如果您想播放自己在程序中产生的一段音频数据,就不是那么简单了,需要利用WIndows wave I/O API的几个函数来实现。

下面结合实例来说明(完整实例可在我的CSDN资源中下载,该例子利用WIndows wave I/O API 函数,实现了播放自定义的一段音频数据(通过sin()函数产生);并且使用了PlaySound()函数播放“250.wav”文件):

 

[cpp]
  1. //需包含的头文件 
  2. #include <MMSystem.h> 
  3. #pragma comment(lib,"winmm.lib") 
  4. //PlaySound()函数和其他WIndows wave I/O API 函数的使用 
  5. #include "math.h"//sin()函数的使用 

//需包含的头文件 #include <MMSystem.h> #pragma comment(lib,"winmm.lib") //PlaySound()函数和其他WIndows wave I/O API 函数的使用 #include "math.h"//sin()函数的使用

 

1.播放文件:

[cpp]
  1. CString path; 
  2. path.Format("%s250.wav",g_BasePath); 
  3. //g_BasePath的取值不用多说,前面已详细介绍了。 
  4. PlaySound(_T(path),0,SND_FILENAME|SND_ASYNC); 

CString path; path.Format("%s250.wav",g_BasePath); //g_BasePath的取值不用多说,前面已详细介绍了。 PlaySound(_T(path),0,SND_FILENAME|SND_ASYNC);

2.播放数据:

(1)确定音频数据的格式及内容:

 

[cpp]
  1. int rate=1000;  //刺激率 
  2. int sampleRate = 44100;  //采样率 
  3. constint NUMPTS = (int) (44100 * 0.5);   // 0.5s 
  4. shortint waveOut[NUMPTS];//音频数据 
  5.  
  6. //内容 
  7. for (int i=0;i<NUMPTS;i++) 
  8.     waveOut[i] = (shortint)ceil(sin(2*3.1415926*rate*i/sampleRate)*20000); 
  9. //格式 
  10. WAVEFORMATEX pFormat; 
  11. pFormat.wFormatTag=WAVE_FORMAT_PCM;  
  12. //simple,uncompressed format 
  13. pFormat.nChannels=1;//1=mono, 2=stereo 
  14. pFormat.nSamplesPerSec=sampleRate; // 44100 
  15. pFormat.nAvgBytesPerSec=sampleRate*2; 
  16. // = nSamplesPerSec * n.Channels * wBitsPerSample/8 
  17. pFormat.nBlockAlign=2; // = n.Channels * wBitsPerSample/8 
  18. pFormat.wBitsPerSample=16; 
  19. //16 for high quality, 8 for telephone-grade 
  20. pFormat.cbSize=0; 

int rate=1000; //刺激率 int sampleRate = 44100; //采样率 const int NUMPTS = (int) (44100 * 0.5); // 0.5s short int waveOut[NUMPTS];//音频数据 //内容 for (int i=0;i<NUMPTS;i++) { waveOut[i] = (short int)ceil(sin(2*3.1415926*rate*i/sampleRate)*20000); } //格式 WAVEFORMATEX pFormat; pFormat.wFormatTag=WAVE_FORMAT_PCM; //simple,uncompressed format pFormat.nChannels=1;//1=mono, 2=stereo pFormat.nSamplesPerSec=sampleRate; // 44100 pFormat.nAvgBytesPerSec=sampleRate*2; // = nSamplesPerSec * n.Channels * wBitsPerSample/8 pFormat.nBlockAlign=2; // = n.Channels * wBitsPerSample/8 pFormat.wBitsPerSample=16; //16 for high quality, 8 for telephone-grade pFormat.cbSize=0; (2)打开一个给定的波形音频输出装置:

 

 

[cpp]
  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.     MessageBox(_T("Failed to open waveform output device.")); 
  7.     return

HWAVEOUT hWaveOut; WAVEHDR WaveOutHdr; MMRESULT result; result = waveOutOpen(&hWaveOut, WAVE_MAPPER,&pFormat,0L, 0L, WAVE_FORMAT_DIRECT); if (result) { MessageBox(_T("Failed to open waveform output device.")); return; }(3)准备波形数据块:

 

 

[cpp]
  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)); 

WaveOutHdr.lpData = (LPSTR)waveOut; WaveOutHdr.dwBufferLength = NUMPTS*2; WaveOutHdr.dwBytesRecorded=0; WaveOutHdr.dwUser = 0L; WaveOutHdr.dwFlags = 0L; WaveOutHdr.dwLoops = 0L; waveOutPrepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR)); (4)向给定音频媒体中输出波形数据块:

 

 

[cpp]
  1. result = waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR)); 
  2. if (result) 
  3.     MessageBox(_T("Failed to play sound")); 
  4.     return

result = waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR)); if (result) { MessageBox(_T("Failed to play sound")); return; }(5)清除准备:

 

 

[cpp]
  1. // Wait until finished sound play 
  2. do {} while (waveOutUnprepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR))==WAVERR_STILLPLAYING); 

// Wait until finished sound play do {} while (waveOutUnprepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR))==WAVERR_STILLPLAYING); (6)关闭给定音频媒体:

 

 

[cpp]
  1. waveOutClose(hWaveOut); 

转载于:https://www.cnblogs.com/lzhitian/archive/2012/02/11/2346290.html

你可能感兴趣的文章
移动端架构的几点思考
查看>>
Tomcat与Spring中的事件机制详解
查看>>
Spark综合使用及用户行为案例区域内热门商品统计分析实战-Spark商业应用实战...
查看>>
初学者自学前端须知
查看>>
Retrofit 源码剖析-深入
查看>>
企业级负载平衡简介(转)
查看>>
ICCV2017 论文浏览记录
查看>>
科技巨头的交通争夺战
查看>>
当中兴安卓手机遇上农行音频通用K宝 -- 卡在“正在通讯”,一直加载中
查看>>
Shell基础之-正则表达式
查看>>
JavaScript异步之Generator、async、await
查看>>
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
直播视频流技术名词
查看>>
网易跟贴这么火,背后的某个力量不可忽视
查看>>
企业级java springboot b2bc商城系统开源源码二次开发-hystrix参数详解(八)
查看>>
java B2B2C 多租户电子商城系统- 整合企业架构的技术点
查看>>
IOC —— AOP
查看>>
比特币现金将出新招,推动比特币现金使用
查看>>
数据库的这些性能优化,你做了吗?
查看>>