在程序中,很有可能會涉及到播放一些音頻文件(比如:.wav文件)和音頻數據,這個問題怎么解決呢?VC++中想要播放一個音頻文件(.wav)是很容易的,只要調用WIndows API函數PlaySound()就可以了,但是,如果您想播放自己在程序中產生的一段音頻數據,就不是那么簡單了,需要利用WIndows wave I/O API的幾個函數來實現。
下面結合實例來說明(**完整實例可在我的CSDN資源中下載:[http://download.csdn.net/detail/margin1988/3677328](http://download.csdn.net/detail/margin1988/3677328)**,該例子利用WIndows wave I/O API 函數,實現了播放自定義的一段音頻數據(通過sin()函數產生);并且使用了PlaySound()函數播放“250.wav”文件):
~~~
//需包含的頭文件
#include <MMSystem.h>
#pragma comment(lib,"winmm.lib")
//PlaySound()函數和其他WIndows wave I/O API 函數的使用
#include "math.h"//sin()函數的使用
~~~
1.播放文件:
~~~
CString path;
path.Format("%s250.wav",g_BasePath);
//g_BasePath的取值不用多說,前面已詳細介紹了。
PlaySound(_T(path),0,SND_FILENAME|SND_ASYNC);
~~~
2.播放數據:
(1)確定音頻數據的格式及內容:
~~~
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)打開一個給定的波形音頻輸出裝置:
~~~
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)準備波形數據塊:
~~~
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)向給定音頻媒體中輸出波形數據塊:
~~~
result = waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR));
if (result)
{
MessageBox(_T("Failed to play sound"));
return;
}
~~~
(5)清除準備:
~~~
// Wait until finished sound play
do {} while (waveOutUnprepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR))==WAVERR_STILLPLAYING);
~~~
(6)關閉給定音頻媒體:
~~~
waveOutClose(hWaveOut);
~~~
- 前言
- VC++中自定義熱鍵及響應
- CFileDialog文件對話框
- VC++中客戶區保存為BMP圖片
- VC++讀、寫注冊表
- VC++播放音頻文件和音頻數據的方法
- VC++調用Matlab編寫的DLL(混合編程)
- VC++中文件讀、寫和其他相關操作匯總
- VC++獲取系統當前時間
- VC++按鈕控件字體設置
- VC++軟件界面風格簡單美化
- VC++中一些常用的數據類型之間的相互轉化
- VC++中截取字符串的方法
- VC++中vector矢量的使用方法及隨機相關
- VC++中結構體的定義及使用
- VC++中List Control控件的使用方法介紹
- VC++中窗口過程函數及其消息發送、響應機制介紹
- VC++中Ribbon編程架構及SDI架構多視圖切換介紹
- 串口通信基礎知識及VC++實現
- VC++中單個鍵盤按鍵的響應
- VC++中的計時器及多媒體高精度計時器
- VC++編寫DLL導出函數及其調用方法
- VC++對話框(CDialog)的全屏顯示及控件居中顯示
- VC++對話框(CDialog)添加背景圖片
- VC++圖片控件(Picture Control)顯示資源位圖(BMP)、文件位圖(BMP)、其它格式文件圖片(JPG\PNG\BMP)的方法
- VC++對Access數據庫的操作(查詢、插入、更新、刪除等)