如何在UWP中用AudioGraph将默认输出设备作为音频录制源?
如何在UWP AudioGraph中捕获默认输出设备的音频(环回捕获)
要捕获声卡和扬声器传输的音频(也就是业内说的“环回捕获”——把输出设备的音频当成输入源来分析),你不能直接用普通的CreateAudioDeviceInputNodeAsync传入输出设备——因为普通输入节点是为麦克风这类物理输入设备设计的。UWP专门提供了环回捕获节点来实现这个需求,下面是针对你现有代码的具体修改方案:
核心修改逻辑
- 替换普通输入节点的创建方式,改用
CreateLoopbackCaptureAsync方法创建环回输入节点,该方法专门用于捕获输出设备的音频流。 - 既可以让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
相关产品推荐
相关产品推荐

