我正在写一个视频播放器。对于音频部分,我使用的是 XAudio2。为此,我有单独的线程正在等待 BufferEnd 事件,然后用新数据填充缓冲区并调用 SubmitSourceBuffer。问题是如果缓冲区大小很小(1024 字节),XAudio2(驱动程序或声卡)在播放下一个缓冲区之前会有很大的延迟。我进行了测量,XAudio 播放这样的块需要长达两倍的时间。(48khz 原始 2 通道 pcm 的 1024 字节块应在近 5 毫秒内播放,但在我的计算机上播放时间长达 10 毫秒)。如果我使缓冲区 4kbytes 或更多,几乎没有延迟。我需要这么小的缓冲区才能与视频时钟或外部时钟同步(就像 ffplay 一样)。如果我的缓冲区太大,那么最终用户会因为同步的东西而在输出中听到很多噪音。
此外,我已经对我的所有功能进行了测量,这些功能正在解码和同步音频或其他任何可能阻塞或产生延迟的功能,它们需要 0 或 1 毫秒来执行,所以它们不是 100% 的问题。
有谁知道它会是什么以及为什么会发生?任何人都可以检查他是否有与小缓冲区相同的延迟问题?