捕获进程特定音频回环接口时出现音频延迟问题
回环音频捕获回放的延迟问题排查与优化请求
我在使用Windows-classic-samples/ApplicationLoopback示例回放捕获的音频时,遇到了30-50ms的延迟。当我将捕获的音频与原进程音频通过同一音频端点同时播放时,发现了该问题。我想了解此延迟是否由回环捕获导致(即原进程发布音频包与捕获接口接收之间存在显著延迟),以及是否有办法将其降低至不可察觉的程度。我复刻并修改了原Application Loopback示例以支持回放捕获的音频,以下是修改及排查测试细节:
修改与排查测试细节
- 添加捕获音频回放功能:为确认进程音频与捕获音频间存在延迟,我初始化了一个与捕获进程所用相同的Audio Endpoint的新Audio Client,并在
CLoopbackCapture::OnAudioSampleRequested()方法中,调用IAudioCaptureClient::GetBuffer后添加IAudioRenderClient::GetBuffer和IAudioRenderClient::ReleaseBuffer调用,实现捕获后立即回放下发。该回调每10ms触发一次,整个方法执行耗时平均1ms,最坏1.5ms(含后续提及的重采样步骤)。 - 捕获样本重采样:由于捕获样本格式与输出Audio Client支持格式未必兼容,我使用Media Foundation实现了重采样步骤,在
CLoopbackCapture::OnAudioSampleRequested()中捕获包后、推送至输出客户端缓冲区前执行。 - 调整IAudioClient缓冲区大小:原捕获端
IAudioClient缓冲区为2秒,我将其改为0(依据IAudioClient::Initialize文档,该方法会确保缓冲区满足音频引擎需求),但调用IAudioClient::GetBufferSize返回0,且调用IAudioClient::GetStreamLatency或IAudioClient::GetDevicePeriod时提示“未实现”;输出端IAudioClient缓冲区设为0后,GetBufferSize返回1056音频帧,相关延迟方法返回有效值。 - 检查音频帧生成时间戳:调用捕获端
IAudioCaptureClient::GetBuffer时,pu64DevicePosition参数始终返回0,但pu64QPCPosition返回有效值,连续回调间差值约10ms(即便能明显听到延迟);同时输出端与捕获端的IAudioClient::GetCurrentPadding均返回0,但仍存在延迟,且暂停终端后恢复时延迟会变化(非等于暂停时长,有最大值,有时还会降低)。 - 实现“同步”回环捕获:我实现了
LoopbackCaptureSync类,不使用Media Foundation工作队列及“Sample Ready”事件,但问题未改善。
恳请提供相关帮助!
内容的提问来源于stack exchange,提问作者naguilera
相关产品推荐
相关产品推荐

