我正在写一个视频播放器。对于音频部分,我使用的是XAudio2。为此,我有单独的线程正在等待 BufferEnd 事件,然后用新数据填充缓冲区并调用 SubmitSourceBuffer。问题是,如果缓冲区大小较小(1024 字节(,XAudio2(驱动程序或声卡(在播放下一个缓冲区之前会有很大的延迟。我进行了测量,XAudio需要两倍的时间才能播放这样的块。(1024 字节的 48kHz 原始 2 通道 PCM 块应该在近 5 毫秒内播放,但在我的电脑上它播放长达 10 毫秒(。如果我制作 4KB 或更多的缓冲区,几乎没有延迟。我需要这么小的缓冲区才能与视频时钟或外部时钟同步(就像ffplay一样(。如果我使缓冲区太大,那么由于同步内容,最终用户将在输出中听到很多噪音。
此外,我还对所有解码和同步音频或任何其他可能阻止或产生延迟的功能进行了测量,它们需要 0 或 1 毫秒才能执行,因此它们不是 100% 的问题。
有谁知道它会是什么以及为什么会发生?任何人都可以检查他是否有与小缓冲区相同的延迟问题吗?
我没有遇到任何使用.wav文件的延迟或暂停。如果您使用的是mp3格式,则在压缩操作期间,它可能会在声音的开头和结尾增加静音,从而导致声音播放延迟。有关更多信息,请参阅此帖子。