vom*_*476 5 c++ audio-streaming ip-camera
尝试使用 waveOutWrite() 实现流畅的音频播放时遇到问题。我的数据包括许多从相机获取的 adpcmdata 块,在解码每个 adpcm 块后,我使用 waveOutWrite() 播放它。第一个块成功播放(至少我能听到),但是当我播放下一个块时遇到问题,这些块之间存在间隙。我尝试在使用 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;
}
}
Run Code Online (Sandbox Code Playgroud)
感谢您阅读我的问题。
我不会这样工作。
当您播放第一个样本时,您不能在下一个样本的时间里睡觉,而是应该使用双缓冲或多缓冲和回调机制。
总体协议如下:
1)从相机或其他任何方式获取第一个块
2)从相机或其他任何方式获取第二个块
3)写入第一个块,然后写入第二个块,无需任何等待。
然后创建一个等待来自回调的信号的循环,并在收到信号后写入下一个捕获的块。
| 归档时间: |
|
| 查看次数: |
5247 次 |
| 最近记录: |