Windows上具有已知输出延迟的音频播放方法 我有一个C++应用程序,它接收一个时间戳的音频流,并试图尽可能接近指定的时间戳播放音频样本。为此,我需要知道从将音频样本放入输出缓冲区到实际听到音频的延迟(具有合理的准确性)

Windows上具有已知输出延迟的音频播放方法 我有一个C++应用程序,它接收一个时间戳的音频流,并试图尽可能接近指定的时间戳播放音频样本。为此,我需要知道从将音频样本放入输出缓冲区到实际听到音频的延迟(具有合理的准确性),windows,audio-streaming,latency,openal,wasapi,Windows,Audio Streaming,Latency,Openal,Wasapi,关于音频输出延迟有很多讨论,但我发现的一切都是关于最小化延迟的。这与我无关,我所需要的只是(在运行时)已知的延迟 在Linux上,我用snd\u pcm\u delay()解决了这个问题,效果非常好,但我正在寻找一个适合Windows的解决方案 我看了以下几点: 使用OpenAL,我测量了80毫秒的延迟,这些延迟是无法解释的。我假设这不是一个硬编码的值,并且我还没有找到任何API来读取延迟。OpenAL有一些扩展声称支持这一点,但据我所知,它只在Linux上实现 Wasapi有GetStrea

关于音频输出延迟有很多讨论,但我发现的一切都是关于最小化延迟的。这与我无关,我所需要的只是(在运行时)已知的延迟

在Linux上,我用
snd\u pcm\u delay()
解决了这个问题,效果非常好,但我正在寻找一个适合Windows的解决方案

我看了以下几点:

  • 使用OpenAL,我测量了80毫秒的延迟,这些延迟是无法解释的。我假设这不是一个硬编码的值,并且我还没有找到任何API来读取延迟。OpenAL有一些扩展声称支持这一点,但据我所知,它只在Linux上实现
  • Wasapi有
    GetStreamLatency()
    ,这听起来像是真正的交易,但这显然只是一些线程轮询间隔之类的东西,所以它也没用。我的机器仍然有30毫秒的延迟
  • DirectSound没有获取延迟的API?但是,仅仅跟踪输出缓冲区就可以足够接近吗
编辑以回应Brad的评论:

  • 我对ASIO的印象是,它主要面向专业音频应用程序和音频鉴赏家,用户可能需要安装特殊的声卡驱动程序,我将不得不处理许可问题。但就功能而言,这似乎是一个不错的选择

我认为ASIO有计算延迟的方法,因为我为ASIO使用的每个程序似乎都以毫秒为单位显示延迟和样本数。但我认为音频设备自身的延迟量总是不确定的。此外,有些人会使用S/PDIF扬声器,因为他们有自己的DAC,所以会增加延迟。谢谢@Brad,我查看了ASIO并添加了一些评论。关于S/PDIF DAC,我认为这在我的时钟同步算法的误差范围内。我不需要完美,只要“足够接近”。嗨@jensnielsen,我知道这是一个7年前的问题,但我有同样的问题,我很好奇你是否找到了解决方案。我注意到Windows 10引入了一些更改,以启用可能相关的低延迟音频:似乎音频驱动程序现在可以报告缓冲区大小(),但我刚刚开始研究这可能有什么帮助…@AllenPestaluky不幸的是,该项目已经死了很久了。但我只是出于好奇才挖掘了源代码,最终我得到了wasapi和一个30毫秒的硬编码调整。感谢您的研究!这真是太糟糕了,但我真的很感激知道事情的结局。具体来说,我希望在两个不同的音频设备之间同步音频输出,因此我认为计算输出延迟是一个很好的开始。也许更好的方法是写我自己的驱动程序。。。