请写一段用C++播放音频源数据的代码
时间: 2024-04-07 09:30:04 浏览: 21
以下是使用C++播放音频源数据的示例代码:
```cpp
#include <iostream>
#include <vector>
#include <windows.h>
#include <mmsystem.h>
// 回调函数,用于填充音频缓冲区
void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
// 如果需要在播放过程中做一些额外的处理,可在此处添加代码
}
int main() {
// 音频源数据
std::vector<char> audioData = { /* 音频数据 */ };
// 初始化WAVEFORMATEX结构体,用于设置音频格式
WAVEFORMATEX wfx;
wfx.wFormatTag = WAVE_FORMAT_PCM; // PCM音频格式
wfx.nChannels = 2; // 双声道
wfx.nSamplesPerSec = 44100; // 采样率为44100Hz
wfx.wBitsPerSample = 16; // 采样位数为16位
wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; // 每个采样块的字节数
wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; // 每秒的数据传输速率
wfx.cbSize = 0; // 额外信息的大小
// 打开音频设备
HWAVEOUT hWaveOut;
MMRESULT result = waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, (DWORD_PTR)waveOutProc, 0, CALLBACK_FUNCTION);
if (result != MMSYSERR_NOERROR) {
std::cout << "Failed to open audio device." << std::endl;
return 1;
}
// 初始化音频头部信息
WAVEHDR waveHdr;
waveHdr.lpData = audioData.data();
waveHdr.dwBufferLength = audioData.size();
waveHdr.dwFlags = 0;
waveHdr.dwLoops = 0;
// 准备音频缓冲区
result = waveOutPrepareHeader(hWaveOut, &waveHdr, sizeof(WAVEHDR));
if (result != MMSYSERR_NOERROR) {
std::cout << "Failed to prepare audio buffer." << std::endl;
waveOutClose(hWaveOut);
return 1;
}
// 播放音频数据
result = waveOutWrite(hWaveOut, &waveHdr, sizeof(WAVEHDR));
if (result != MMSYSERR_NOERROR) {
std::cout << "Failed to play audio." << std::endl;
waveOutUnprepareHeader(hWaveOut, &waveHdr, sizeof(WAVEHDR));
waveOutClose(hWaveOut);
return 1;
}
// 等待音频播放完成
while (waveHdr.dwFlags & WHDR_STILLPLAYING) {
Sleep(100);
}
// 清理资源
waveOutUnprepareHeader(hWaveOut, &waveHdr, sizeof(WAVEHDR));
waveOutClose(hWaveOut);
return 0;
}
```
请注意,以上示例代码是基于Windows平台的,并使用了Windows Multimedia API (winmm.lib) 来实现音频播放功能。如果在其他平台上运行,需要使用相应的音频库和API进行调整。