Windows AudioGraph无物理设备时不消耗AudioFrames的问题
解决Windows AudioGraph无硬件输入时AudioFrameInputNode帧无法消耗的问题
核心原因
AudioGraph默认依赖硬件时钟源(如麦克风、扬声器等设备的时钟)触发音频量子处理循环。当仅使用软件生成的AudioFrameInputNode而无任何硬件输入/输出节点时,音频图缺少驱动处理的时钟信号,导致AudioFrameInputNode的帧持续堆积,最终触发"Too many queued frames"错误,且输出文件仅含静音。
解决方案
1. 显式设置AudioGraph为软件时钟源
创建AudioGraph时,将时钟源指定为AudioClockSource::Software,让音频图通过软件生成时钟信号,独立驱动处理循环:
// C++/WinRT 示例 AudioGraphSettings settings(AudioRenderCategory::Media); settings.ClockSource(AudioClockSource::Software); auto createResult = co_await AudioGraph::CreateAsync(settings); if (createResult.Status() != AudioGraphCreationStatus::Success) { // 处理创建失败逻辑 } AudioGraph audioGraph = createResult.Graph();
设置后,即使没有硬件节点,音频图也会定期触发量子处理,消耗AudioFrameInputNode队列中的帧。
2. 验证音频图与输出节点状态
确保音频图启动后处于Running状态,且AudioFileOutputNode已正确开始录制:
// 启动音频图 audioGraph.Start(); // 启动文件录制 fileOutputNode.Start();
可以监听AudioGraph.StatusChanged事件,确保状态未意外中断。
3. 备选方案:添加空设备输出节点(若软件时钟不生效)
若软件时钟方案存在兼容问题,可创建一个增益为0的AudioDeviceOutputNode,通过硬件时钟驱动处理(无实际声音输出):
auto outputResult = co_await audioGraph.CreateDeviceOutputNodeAsync(); if (outputResult.Status() == AudioDeviceNodeCreationStatus::Success) { AudioDeviceOutputNode outputNode = outputResult.DeviceOutputNode(); outputNode.OutgoingGain(0.0f); // 静音输出 // 无需连接到子混音,节点存在即可提供时钟 }
验证效果
设置软件时钟后,AudioFrameInputNode的QuantumStarted事件会正常请求帧数据,队列不会堆积,输出文件将正确写入你生成的音频内容。
内容的提问来源于stack exchange,提问作者rcbevans
相关产品推荐
相关产品推荐

