gpt4 book ai didi

c++ - 如何使用 waveOutWrite() 使音频播放流畅

转载 作者:太空狗 更新时间:2023-10-29 23:08:27 26 4
gpt4 key购买 nike

我在尝试使用 waveOutWrite() 实现流畅的音频播放时遇到问题。我的数据包括许多从相机获取的 adpcm 数据 block ,在解码每个 adpcm block 后,我使用 waveOutWrite() 播放它。第一个 block 成功播放(至少我能听到)但是当我播放下一个 block 时我遇到了问题,这些 block 之间存在间隙。我尝试在使用 waveOutWrite() 后调用 sleep() 但它不行。任何人都可以告诉我在这种情况下我是如何变得顺利的?我播放音频的方式有问题吗?

for (i = 0, i < MaxBlockData, i++)  


BYTE * pcmBuff = new BYTE[length*8];
memset(pcmBuff, 0, length*8);
G726 g726;

int pcmDataSize = 0;
g726.SetRate(g726.Rate32kBits);
g726.SetLaw(g726.PCM16);
pcmDataSize = g726.Decode(pcmBuff, adpcmData[i], 0, length*8); /decode adcmData PCM 16

if(pcmDataSize > 0)
{
int sampleRate = 8000;
CHAR* waveIn = new CHAR[pcmDataSize];

HWAVEIN hWaveIn;
WAVEHDR WaveInHdr;
MMRESULT result;
HWAVEOUT hWaveOut;

WAVEFORMATEX pFormat;
pFormat.wFormatTag = WAVE_FORMAT_PCM;
pFormat.nChannels = 1;
pFormat.nSamplesPerSec = sampleRate;
pFormat.nAvgBytesPerSec = 2 * sampleRate;
pFormat.nBlockAlign = 2;
pFormat.wBitsPerSample = 16;
pFormat.cbSize = 0;

result = waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT);

if(result != MMSYSERR_NOERROR)
{
char fault[256];
waveInGetErrorTextA(result, fault, 256);
MessageBoxA(NULL, fault, "Failed to open waveform input device.", MB_OK | MB_ICONEXCLAMATION);
return;
}

WaveInHdr.lpData = (LPSTR)waveIn;
WaveInHdr.dwBufferLength = pcmDataSize;
WaveInHdr.dwBytesRecorded = 0;
WaveInHdr.dwUser = 0;
WaveInHdr.dwFlags = 0;
WaveInHdr.dwLoops = 0;

waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
memcpy(WaveInHdr.lpData, pcmBuff, pcmDataSize);

if(waveOutOpen(&hWaveOut, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT))
{
MessageBoxA(NULL, "Failed to replay", NULL, MB_OK | MB_ICONEXCLAMATION );
}

waveOutWrite(hWaveOut, &WaveInHdr, sizeof(WaveInHdr));
Sleep((pcmDataSize/sampleRate ) * 1000); //Sleep for as long as there was recorded

waveOutUnprepareHeader(hWaveOut, &WaveInHdr, sizeof(WAVEHDR));
waveInUnprepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
waveInClose(hWaveIn);
waveOutClose(hWaveOut);


WaveInHdr.lpData = NULL;
delete []waveIn;
}
}

感谢阅读我的问题。

最佳答案

我不会这样工作的。
当你播放第一个样本时,你不能在下一个样本的时间休眠,相反你应该使用双缓冲或多缓冲和回调机制。
总体协议(protocol)如下:
1) 从相机或其他任何地方获取第一个 block
2)从相机或其他任何地方获取第二个 block
3) 写入第一个 block ,然后写入第二个 block ,无需等待。
然后创建一个循环等待来自回调的信号,并在收到信号后写入下一个捕获的 block 。

关于c++ - 如何使用 waveOutWrite() 使音频播放流畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9554625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com