我正在尝试使用 xaudio 播放原始 pcm 数据,但播放延迟很大(> = 5ms)。我正在使用下一个代码执行此操作:
bool Play(uint8_t *data, size_t size)
{
_xaudio_buffer.AudioBytes = size;
_xaudio_buffer.pAudioData = data;
Time t1;
if (_g_source->SubmitSourceBuffer(&_xaudio_buffer) != S_OK)
return false;
if(WaitForSingleObjectEx(_voice_callback.hBufferEndEvent,INFINITE,true) != WAIT_OBJECT_0)
return false;
Time t2;
printf("%d\n",t2-t1);
}
Time 类只是 GetTickCount 下的一个包装器,生成的 t2-t1 将以毫秒为单位返回差异。我已经检查过我的 Time 课程不会产生任何额外的延迟。
以毫秒为单位计算播放时间并不难:play_time = size*1000 / (channels*(bits_per_sample/8) * frequency)
因此,对于大小为 4608 字节、48 khz、2 个通道、每个样本 16 位的数据,播放这样的块需要将近 24 毫秒。相反,我上面显示的代码需要大约 >= 31 毫秒来播放这样的块。是什么造成了这种延迟?如果我正在编写视频播放器并从实时流中获取数据(我已经具有同步功能,但是对于这样的小样本,5ms 的延迟会产生不理想的声音),如何处理它?
此外,我已经在 2 台具有不同硬件的 Windows 7 计算机上测试了此代码。两者都产生相同的延迟。