设为首页 加入收藏

TOP

VC++播放音频文件的方法(一)
2013-07-22 18:14:20 来源: 作者: 【 】 浏览:304
Tags:播放 音频 文件 方法

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

  下面结合实例来说明

  ,该例子利用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 format

  15 pFormat.nChannels=1;//1=mono, 2=stereo

  16 pFormat.nSamplesPerSec=sampleRate; // 44100

  17 pFormat.nAvgBytesPerSec=sampleRate*2;

  18 // = nSamplesPerSec * n.Channels * wBitsPerSample/8

  19 pFormat.nBlockAlign=2; // = n.Channels * wBitsPerSample/8

  20 pFormat.wBitsPerSample=16;

  21 //16 for high quality, 8 for telephone-grade

  22 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));

   

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC进程通信之共享存储区 下一篇VC++实现线程注入

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: