如何使用默认输出设备作为使用 AudioGraph 录制音频的源?

Posted

技术标签:

【中文标题】如何使用默认输出设备作为使用 AudioGraph 录制音频的源?【英文标题】:How to use default output device as a source to record audio with AudioGraph? 【发布时间】:2018-01-26 15:39:58 【问题描述】:

在我的 UWP 应用程序中,我有以下代码,它与输入设备 (DeviceInformation) 一起使用,用于录制音频并进行处理。我想通过使用默认输出设备而不是麦克风来扩展它。这基本上意味着应用程序将分析通过声卡和扬声器的音频。

这是我的代码:

 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");


            // Create a device input node using the default audio input device
            CreateAudioDeviceInputNodeResult deviceInputNodeResult = await graph.CreateDeviceInputNodeAsync(MediaCategory.Other, graph.EncodingProperties, SelectedDevice);

            if (deviceInputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
            
                // Cannot create device input node
                System.Diagnostics.Debug.WriteLine(String.Format("Audio Device Input unavailable because 0", deviceInputNodeResult.Status.ToString()));

                return;
            

            AudioDeviceInputNode deviceInputNode = deviceInputNodeResult.DeviceInputNode;
            System.Diagnostics.Debug.WriteLine("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;

如何在

中使用默认的输出设备
CreateAudioDeviceInputNodeResult deviceInputNodeResult = await graph.CreateDeviceInputNodeAsync(MediaCategory.Other, graph.EncodingProperties, SelectedDevice);

【问题讨论】:

msdn论坛social.msdn.microsoft.com/Forums/en-US/…已经回答了这个问题,即使连接了耳机和其他设备,您也可以更改输出设备 不,那是不同的东西。我想录制/处理通过声卡到输出(扬声器)而不是麦克风的音频。 要录制播放声卡声音***.com/questions/41615457/… 【参考方案1】:

在一行中获取当前默认的音频输出(Render)设备:

DeviceInformation defaultDevice = await DeviceInformation.CreateFromIdAsync(MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default));

您还可以使用MediaDevice 类获取默认捕获设备并监听每个更改的事件。

您似乎无法使用 Render 设备作为输入节点来录制系统音频 (see here)

【讨论】:

以上是关于如何使用默认输出设备作为使用 AudioGraph 录制音频的源?的主要内容,如果未能解决你的问题,请参考以下文章

最小化或锁定时继续播放 Audiograph UWP 输出

AudioGraph 可以播放流吗?

uwp AudioGraph 音频处理

如何在 AudioGraph 中将 RemoteIO、Mixer 和 Filter 连接在一起?

UWP AudioGraph API - FrameOutputNode 读取字节错误

AudioGraph DesiredSamplesPerQuantum 属性被忽略