VC++播放音頻文件和音頻數據的方法


在程序中,很有可能會涉及到播放一些音頻文件(比如:.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 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));

(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 play
2 do {} while (waveOutUnprepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR))==WAVERR_STILLPLAYING);

(6)關閉給定音頻媒體:

1 waveOutClose(hWaveOut);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM