You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在UWP中用AudioGraph将默认输出设备作为音频录制源?

如何在UWP AudioGraph中捕获默认输出设备的音频(环回捕获)

要捕获声卡和扬声器传输的音频(也就是业内说的“环回捕获”——把输出设备的音频当成输入源来分析),你不能直接用普通的CreateAudioDeviceInputNodeAsync传入输出设备——因为普通输入节点是为麦克风这类物理输入设备设计的。UWP专门提供了环回捕获节点来实现这个需求,下面是针对你现有代码的具体修改方案:

核心修改逻辑

  1. 替换普通输入节点的创建方式,改用CreateLoopbackCaptureAsync方法创建环回输入节点,该方法专门用于捕获输出设备的音频流。
  2. 既可以让API自动使用系统默认输出设备,也可以手动指定设备ID来适配自定义场景。

修改后的完整代码片段

AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Media) { QuantumSizeSelectionMode = QuantumSizeSelectionMode.LowestLatency };
CreateAudioGraphResult result = await AudioGraph.CreateAsync(settings);
if (result.Status != AudioGraphCreationStatus.Success) {
    // Cannot create graph
    System.Diagnostics.Debug.WriteLine(String.Format("AudioGraph Creation Error because {0}", result.Status.ToString()));
    return;
}
graph = result.Graph;
// Create a device output node
CreateAudioDeviceOutputNodeResult deviceOutputNodeResult = await graph.CreateDeviceOutputNodeAsync();
if (deviceOutputNodeResult.Status != AudioDeviceNodeCreationStatus.Success) {
    return;
}
AudioDeviceOutputNode deviceOutputNode = deviceOutputNodeResult.DeviceOutputNode;
System.Diagnostics.Debug.WriteLine("Device Output connection successfully created");

// --- 这里是修改的核心部分 ---
// 方式1:直接捕获系统默认输出设备的音频(无需手动获取设备ID)
CreateAudioDeviceInputNodeResult deviceInputNodeResult = await graph.CreateLoopbackCaptureAsync();

// 方式2:手动指定默认输出设备ID(如果需要支持用户选择其他输出设备的话)
// string defaultOutputDeviceId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);
// CreateAudioDeviceInputNodeResult deviceInputNodeResult = await graph.CreateLoopbackCaptureAsync(defaultOutputDeviceId);

if (deviceInputNodeResult.Status != AudioDeviceNodeCreationStatus.Success) {
    // Cannot create loopback input node
    System.Diagnostics.Debug.WriteLine(String.Format("Loopback Audio Input unavailable because {0}", deviceInputNodeResult.Status.ToString()));
    return;
}
AudioDeviceInputNode deviceInputNode = deviceInputNodeResult.DeviceInputNode;
System.Diagnostics.Debug.WriteLine("Loopback Device Input connection successfully created");
// --- 修改结束 ---

frameOutputNode = graph.CreateFrameOutputNode();
deviceInputNode.AddOutgoingConnection(frameOutputNode);
AudioFrameInputNode frameInputNode = graph.CreateFrameInputNode();
frameInputNode.AddOutgoingConnection(deviceOutputNode);
// frameInputNode.QuantumStarted += FrameInputNode_QuantumStarted;
// Attach to QuantumStarted event in order to receive synchronous updates from audio graph (to capture incoming audio).
graph.QuantumStarted += GraphOnQuantumProcessed;

关键细节说明

  • CreateLoopbackCaptureAsync创建的AudioDeviceInputNode,数据源是输出设备正在播放的音频(也就是扬声器的输出),完全匹配你“分析声卡和扬声器传输音频”的需求。
  • 如果需要支持用户选择其他输出设备,可以通过DeviceInformation.FindAllAsync(DeviceClass.AudioRender)枚举所有可用的输出设备,让用户选择后再传入对应设备ID到CreateLoopbackCaptureAsync。
  • 环回捕获的音频流处理逻辑和你原来的麦克风输入完全一致,你可以继续使用现有的GraphOnQuantumProcessed事件来处理音频帧数据。

内容的提问来源于stack exchange,提问作者Niels

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:26:36