2

我正在尝试使用 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 计算机上测试了此代码。两者都产生相同的延迟。

4

0 回答 0