新闻详情

新闻详情

首页 / 资讯中心 / 详情

Windows-universal-samples 音频图(AudioGraph)实战指南:用 Windows.Media.Audio 构建路由、混音与音频处理管线

发布时间:2026/9/25 1:43:13来源:尧图网络
Windows-universal-samples 音频图(AudioGraph)实战指南:用 Windows.Media.Audio 构建路由、混音与音频处理管线
示例工程【免费下载链接】Windows-universal-samplesAPI samples for the Universal Windows Platform.项目地址https://gitcode.com/gh_mirrors/wi/Windows-universal-samples点击查看免费下载本指南以 Windows-universal-samples 仓库中的 AudioCreation 示例Samples/AudioCreation/README.md为核心系统讲解 UWP 平台下基于Windows.Media.Audio命名空间的音频图Audio Graph编程模型。你将掌握音频图的节点拓扑、量子Quantum机制、六种典型场景文件播放、设备采集、自定义帧输入、子混音、系统内置效果、自定义效果的完整实现路径并能直接在 Visual Studio 中构建与运行该示例验证所学。音频图把音频处理拆成一张节点-连接的数据流图AudioCreation 示例的核心价值在于演示Windows.Media.Audio命名空间。音频图本质上是一组互相连接的音频节点音频数据在其中流动构成一条可编程的数据流管线音频输入节点Input Node向图中供给音频数据来源可以是音频输入设备、音频文件也可以是自定义代码音频输出节点Output Node图中音频处理结果的最终去向可路由到音频输出设备、音频文件或自定义代码子混音节点Submix Node接收一个或多个节点的输出将其合并为单一输出后再路由给图中的其他节点。当所有节点创建完毕、连接关系建立后只需启动音频图graph.Start()数据便会自动从输入节点出发流经子混音节点最终抵达输出节点。正是这种模型让从麦克风录音到文件从文件播放到扬声器多路音频混合等场景的实现变得非常简洁——这也是 AudioCreation 示例要演示的核心模式。在节点之上还有一层**音频效果Audio Effect**机制图中每个节点都可以挂载零个或多个效果对流经该节点的音频做实时处理。平台内置了回声Echo、均衡器Equalizer、限制器Limiter、混响Reverb等效果仅需几行代码即可挂载同时开发者也能实现与内置效果完全一致的自定义音频效果。示例的项目结构整个示例位于 Samples/AudioCreation采用 C#UWP实现包含两个工程主程序AudioCreationAudioCreation.csproj包含六个场景页面每个场景由 XAML 布局与 code-behind 组成并通过 AudioCreation.sln 组织构建自定义效果工程CustomEffectCustomEffect.csproj独立程序集仅含一个实现IBasicAudioEffect接口的回声效果类CustomEffect.cs供场景六引用。场景一文件播放File Playback——最基础的图拓扑该场景演示如何用音频图播放本地音频文件操作路径为点击Load File弹出文件选择器支持 .mp3、.wav、.wma、.m4a选中文件后点击Start Graph开始播放Loop开关控制循环播放Playback Speed滑杆调节播放速度。节点搭建与连接从代码实现Scenario1_FilePlayback.xaml.cs可见图的构建分两步创建图与默认输出设备节点。使用AudioGraphSettings指定渲染类别示例使用AudioRenderCategory.Media调用AudioGraph.CreateAsync(settings)异步创建随后通过graph.CreateDeviceOutputNodeAsync()创建代表默认输出设备的AudioDeviceOutputNodeAudioGraphSettings settings new AudioGraphSettings(AudioRenderCategory.Media); CreateAudioGraphResult result await AudioGraph.CreateAsync(settings); if (result.Status ! AudioGraphCreationStatus.Success) { /* 处理创建失败 */ } graph result.Graph; CreateAudioDeviceOutputNodeResult deviceOutputNodeResult await graph.CreateDeviceOutputNodeAsync(); deviceOutput deviceOutputNodeResult.DeviceOutputNode;创建文件输入节点并建立连接。文件经FileOpenPicker选取后通过graph.CreateFileInputNodeAsync(file)生成AudioFileInputNode再调用fileInput.AddOutgoingConnection(deviceOutput)把数据接到输出节点。示例对创建结果做了两类防御性校验AudioFileNodeCreationStatus.Success用于判断文件是否可读文件时长不足 3 秒fileInput.Duration TimeSpan.FromSeconds(3)则提示换文件。裁剪、循环与变速该场景还展示了三个高频实用能力均在 Scenario1_FilePlayback.xaml.cs 中裁剪播放区间fileInput.StartTime TimeSpan.FromSeconds(3)让文件从第 3 秒开始播放注释指出EndTime可用于从文件尾部裁剪循环播放fileInput.LoopCount null表示无限循环设为0停止循环设非零值则为有限次循环。切换 Loop 开关时还会处理文件已播完的边界情况——先Seek回 StartTime 再开启循环变速播放fileInput.PlaybackSpeedFactor playSpeedSlider.ValueXAML 中滑杆取值范围为 0.53.0见 Scenario1_FilePlayback.xaml。页面导航离开时调用graph.Dispose()释放整个图这是所有场景共用的资源清理模式。场景二设备采集Device Capture——低延迟录音 监听该场景把麦克风输入同时路由到两个输出一个用于监听输出设备一个用于录音音频文件并特别采用LowestLatency量子模式。操作流程先在下拉列表选择输入/输出设备 →Pick Output File选择录音目标文件 →Create Graph建图 →Record开始录制 →Stop结束并写盘。低延迟配置与设备选择实现见 Scenario2_DeviceCapture.xaml.cs关键配置集中在CreateAudioGraph()AudioGraphSettings settings new AudioGraphSettings(AudioRenderCategory.Media); settings.QuantumSizeSelectionMode QuantumSizeSelectionMode.LowestLatency; settings.PrimaryRenderDevice outputDevices[outputDevicesListBox.SelectedIndex - 1];QuantumSizeSelectionMode.LowestLatency量子quantum指音频图单次处理的音频数据量。设为最低延迟意味着音频处理延迟尽可能小代价是设备断连等异常必须显式处理——示例为此订阅了graph.UnrecoverableErrorOccurred事件在设备出错时释放旧图、重新枚举设备并复位 UI设备枚举通过DeviceInformation.FindAllAsync(MediaDevice.GetAudioRenderSelector())与MediaDevice.GetAudioCaptureSelector()分别枚举输出与输入设备填入两个 ListBox输入节点绑定设备graph.CreateDeviceInputNodeAsync(MediaCategory.Other, graph.EncodingProperties, device)中传入graph.EncodingProperties使输入节点以图自身的编码格式工作。一分二的路由与文件落盘SelectOutputFile()中先由FileSavePicker选择目标文件提供 PCM/WMA/MP3 三种格式选择按扩展名构造对应的MediaEncodingProfileMediaEncodingProfile.CreateWav / CreateWma / CreateMp3均使用AudioEncodingQuality.High再创建AudioFileOutputNodeCreateAudioFileOutputNodeResult fileOutputNodeResult await graph.CreateFileOutputNodeAsync(file, fileProfile); // 输入节点同时接到两个输出节点监听 录音 deviceInputNode.AddOutgoingConnection(fileOutputNode); deviceInputNode.AddOutgoingConnection(deviceOutputNode);录音停止时示例先graph.Stop()防止数据丢失再调用await fileOutputNode.FinalizeAsync()完成文件收尾返回值TranscodeFailureReason为None才表示写盘成功。场景三帧输入节点Frame Input Node——用自定义代码合成音频该场景演示如何从自定义代码生成 PCM 数据并注入音频图点击Generate Audio开始播放由代码实时合成的 1kHz 正弦波Stop停止。实现位于 Scenario3_FrameInputNode.xaml.cs。建图与节点创建AudioFrameInputNode创建时显式复用了图的编码属性并把声道数设为单声道AudioEncodingProperties nodeEncodingProperties graph.EncodingProperties; nodeEncodingProperties.ChannelCount 1; frameInputNode graph.CreateFrameInputNode(nodeEncodingProperties); frameInputNode.AddOutgoingConnection(deviceOutputNode); frameInputNode.Stop(); // 先处于停止态由按钮控制 frameInputNode.QuantumStarted node_QuantumStarted; graph.Start(); // 图启动帧输入节点可独立启停QuantumStarted 驱动的数据供给QuantumStarted事件在音频图需要更多数据时被触发事件参数携带RequiredSamples本次需要提供的样本数。示例强调按需提供恰好所需样本量即可多余样本会引入额外延迟。回调中生成AudioFrame并调用frameInputNode.AddFrame(audioData)提交给图消费private void node_QuantumStarted(AudioFrameInputNode sender, FrameInputNodeQuantumStartedEventArgs args) { uint numSamplesNeeded (uint)args.RequiredSamples; if (numSamplesNeeded ! 0) { AudioFrame audioData GenerateAudioData(numSamplesNeeded); frameInputNode.AddFrame(audioData); } }用 unsafe 代码写底层缓冲区生成正弦波需要直接写入AudioFrame底层内存示例通过 COM 接口IMemoryBufferByteAccessGuid5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D拿到字节指针后强转为float*写入。GenerateAudioData()中缓冲区大小为samples * sizeof(float)单声道采样率取自graph.EncodingProperties.SampleRate以amplitude * sin(theta)逐样本填充 1kHz、幅度 0.3 的正弦波。这要求工程开启AllowUnsafeBlocksAudioCreation.csproj 中所有配置均设为true。场景四子混音节点Submix Nodes——两路混音 回声效果该场景把两个音频文件混音并在混音输出上挂载回声效果再送往扬声器Load File 1 / Load File 2选文件Start Graph启动Echo开关实时切换效果。实现见 Scenario4_Submix.xaml.cs。拓扑与增益控制图包含四个节点两个AudioFileInputNode、一个AudioSubmixNode、一个AudioDeviceOutputNode。值得注意的实现细节防削波增益两路文件同时播放可能削波因此连接时显式设置增益为 0.5——fileInputNode1.AddOutgoingConnection(submixNode, 0.5)第二个文件同理子混音输出再衰减submixNode.OutgoingGain 0.5进一步压低混音输出的响度代码注释指出所有节点都具备OutgoingGain属性。回声效果定义与动态开关echoEffect new EchoEffectDefinition(graph); echoEffect.WetDryMix 0.7f; // 湿/干信号混合比例 echoEffect.Feedback 0.5f; // 反馈量 echoEffect.Delay 500.0f; // 延迟毫秒数 submixNode.EffectDefinitions.Add(echoEffect); submixNode.DisableEffectsByDefinition(echoEffect); // 初始关闭由 UI 开关控制开关切换时调用submixNode.EnableEffectsByDefinition(echoEffect)/DisableEffectsByDefinition(echoEffect)。注释明确指出这一效果模型被所有音频节点类型实现因此效果可以挂在图中任意位置子混音节点还可以链式串联轻松构造多层效果叠加的复杂混音。场景五系统内置效果In-box Effects——Echo / Reverb / Equalizer / Limiter该场景集中演示平台内置的四种效果Echo、Reverb、Equalizer、LimiterUI 允许加载音频文件后逐个开关并实时调节参数。代码位于 Scenario5_InboxEffects.xaml.cs拓扑极简AudioFileInputNode→AudioDeviceOutputNode四个效果定义全部加入文件输入节点的EffectDefinitions列表初始均通过DisableEffectsByDefinition关闭。Echo回声EchoEffectDefinition使用与场景四相同的三个参数WetDryMix0.7、Feedback0.5、Delay500ms。UI 中 Delay 滑杆范围 502000msScenario5_InboxEffects.xaml拖动时实时写回echoEffectDefinition.Delay。Reverb混响ReverbEffectDefinition的初始化参数完整可见参数初始值说明WetDryMix50湿/干混合ReflectionsDelay120反射延迟ReverbDelay30混响延迟RearDelay3后置延迟DecayTime2衰减时间秒UI 只暴露 DecayTime 一个滑杆范围 0.520 秒回调中实时写入reverbEffectDefinition.DecayTime。Limiter限制器LimiterEffectDefinition初始Loudness 1000、Release 10UI 滑杆范围 11800用于实时调节响度值。Equalizer均衡器EqualizerEffectDefinition内置 4 个频段Bands[0..3]示例设定的中心频率与增益为100Hz4.033、900Hz1.6888、5kHz2.4702、12kHz5.5958带宽 1.52.0。UI 四个垂直滑杆取值 0100代码通过ConvertRange()将其线性映射到 xapofx.h 中 FXEQ 的增益范围fxeq_min_gain 0.126到fxeq_max_gain 7.94再写入eqEffectDefinition.Bands[i].Gain。场景六自定义效果Custom Effects——实现 IBasicAudioEffect 并接入图该场景演示如何编写自定义音频效果并接入音频图Load File选文件后Start Graph播放时即应用自定义回声效果。核心代码全部封装在独立工程 CustomEffect 的 CustomEffect.cs 中主工程通过工程引用见 AudioCreation.csproj 的ProjectReference接入。实现 IBasicAudioEffect 的四个关键成员AudioEchoEffect类实现了IBasicAudioEffect接口需覆盖以下成员SupportedEncodingProperties声明支持的编码格式。构造函数中注册了 44.1kHz 与 48kHz 的单声道 32 位浮点 PCMAudioEncodingProperties.CreatePcm(44100, 1, 32)Subtype MediaEncodingSubtypes.FloatSetEncodingProperties系统选定编码后调用。示例按encodingProperties.SampleRate分配回声缓冲数组echoBuffer实现恰好 1 秒的延迟线并记录当前写入游标ProcessFrame音频图每帧调用入参ProcessAudioFrameContext同时提供输入帧与输出帧。处理逻辑是经典回声算法——inputData inputDataInFloat[i] * (1 - Mix)echoData echoBuffer[当前游标] * Mix输出为两者之和再把原始输入写回缓冲、游标循环回绕同样通过IMemoryBufferByteAccess以unsafe指针方式读写帧缓冲区SetProperties / DiscardQueuedFrames / Close前两者分别用于接收属性集配置与清空缓冲Array.Clear回声缓冲并重置游标Close用于释放资源。属性集驱动的 Mix 参数效果暴露一个Mix属性不设 C# 直接 setter所有更新必须经属性集完成SetProperties保存传入的IPropertySet读取时用TryGetValue(Mix, out val)取值默认 0.5f。主工程挂载时正是通过属性集注入初值PropertySet echoProperties new PropertySet(); echoProperties.Add(Mix, 0.5f); AudioEffectDefinition echoEffectDefinition new AudioEffectDefinition(typeof(AudioEchoEffect).FullName, echoProperties); fileInputNode.EffectDefinitions.Add(echoEffectDefinition);场景六还演示了AudioFileInputNode.FileCompleted事件文件播完后停止图、调用sender.Reset()复位节点使再次启动可从文件头重新播放。系统要求与构建运行系统要求按原文档声明Client 端 Windows 10Phone 端 Windows 10。工程 AudioCreation.csproj 的TargetPlatformVersion/TargetPlatformMinVersion均为 10.0.22621.0并依赖Microsoft.NETCore.UniversalWindowsPlatform5.0.0 包。构建步骤若以 ZIP 方式下载整个样本集务必解压整个归档而不仅是本示例目录——因为工程通过$(SharedContentDir)引用了仓库根目录 SharedContent 下的共享代码App.xaml.cs、MainPage.xaml.cs、样式与 SDK 媒体资源等见 AudioCreation.csproj 的编译项启动 Visual Studio选择File Open Project/Solution从解压目录进入Samples/AudioCreation/cs双击 AudioCreation.sln 打开解决方案本示例提供 C# 版本仓库中大量其他示例同时提供 cpp / cppwinrt / vb 等多语言版本此处以 C# 为准按 CtrlShiftB 或选择Build Build Solution完成构建。运行步骤仅部署选择Build Deploy Solution部署并调试运行按 F5 或Debug Start Debugging不调试直接运行按 CtrlF5 或Debug Start Without Debugging。小结AudioCreation 示例以六个递进的场景完整覆盖了音频图编程的核心能力从最基础的文件播放图拓扑到低延迟设备采集、自定义帧数据注入、子混音链路、内置效果体系直至自研IBasicAudioEffect效果的接入与参数化。结合 README.md 的流程描述与 cs/AudioCreation 下各场景的 code-behind 源码你可以把它当作一套可运行的音频处理实验台改一改节点连接、调一调效果参数、或替换GenerateAudioData中的波形算法即可快速验证路由、混音与处理类音频方案在 UWP 上的落地方式。赞分享示例工程【免费下载链接】Windows-universal-samplesAPI samples for the Universal Windows Platform.项目地址https://gitcode.com/gh_mirrors/wi/Windows-universal-samples点击查看免费下载相关推荐TiXL 音频系统完全指南时间线音频剪辑、路由混音图与音频反应式视觉TiXL 音频系统完全指南时间线音频剪辑、路由混音图与音频反应式视觉 本篇技术指南围绕 TiXL开源实时动态图形工具的音频子系统展开系统讲解时间线音频剪音视频图形学桌面应用vscode-cpptools调试器扩展内存断点完全指南vscode cpptools调试器扩展内存断点完全指南 内存断点Memory Breakpoint核心痛点解析 在C/C开发中开发者常面临内存相关音频实战精通企业微信自动化用WorkTool打造你的智能办公助手实战精通企业微信自动化用WorkTool打造你的智能办公助手 想象一下每天早晨你还在通勤路上团队的工作汇报已经自动发送到企业微信群重要客户的消息总能第一GUI 自动化即时通讯RPA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

NodeGui 中 QFontStretch 枚举详解:QFont 字体伸展度的 10 级取值与 NAPI 绑定实现 2026/9/25 2:18:20

NodeGui 中 QFontStretch 枚举详解:QFont 字体伸展度的 10 级取值与 NAPI 绑定实现

桌面应用跨平台 【免费下载链接】nodegui A library for building cross-platform native desktop applications with Node.js and CSS 🚀. React NodeGui : https://react.nodegui.org and Vue NodeGui: https://vue.nodegui.org 项目地址: https://git…

阅读更多 →
吸烟数据集带标注:YOLOv8训练与小目标召回提升实战 2026/9/25 2:18:20

吸烟数据集带标注:YOLOv8训练与小目标召回提升实战

简介:这份「吸烟数据集带标注」面向人工智能与机器学习方向的开发者、算法工程师及高校学生,用于训练和评估吸烟行为识别与预测模型。数据集以监督学习为目标,每个样本均带有吸烟者或非吸烟者的标注信息,可支撑分类、特征分析等典…

阅读更多 →
Java MapReduce实战:从本地调试到YARN集群的完整闭环 2026/9/25 2:18:20

Java MapReduce实战:从本地调试到YARN集群的完整闭环

简介:本资源是一份面向高校大数据课程学习者与Hadoop初学者的Java操作MapReduce完整实验报告,聚焦气象数据分析实战场景,解决MapReduce编程模型理解与集群部署落地的核心难点。文档以CentOS 7 Hadoop 2.7.7 JDK 1.8为实验环境,详…

阅读更多 →
在 VoltAgent 模型路由中使用 v0 模型:快速接入、环境变量与源码级路由原理 2026/9/25 2:18:20

在 VoltAgent 模型路由中使用 v0 模型:快速接入、环境变量与源码级路由原理

人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆 【免费下载链接】voltagent AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework 项目地址: https://gitcode.com/gh_mirrors/vo/voltagent 点击查看 免费下载 导…

阅读更多 →
FAST 1.x 颜色工具深度解析:xyzToRGB() 函数的签名、参数与色域越界处理 2026/9/25 2:18:14

FAST 1.x 颜色工具深度解析:xyzToRGB() 函数的签名、参数与色域越界处理

前端UI组件 【免费下载链接】fast The adaptive interface system for modern web experiences. 项目地址: https://gitcode.com/gh_mirrors/fa/fast 点击查看 免费下载 本文基于 FAST(microsoft/fast-colors,1.x 版本)官方 API …

阅读更多 →
Humanizer 流畅日期 API 详解:In.Three 静态类实现 3 秒到 3 年的日期计算 2026/9/25 2:18:13

Humanizer 流畅日期 API 详解:In.Three 静态类实现 3 秒到 3 年的日期计算

开发工具 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址: https://gitcode.com/gh_mirrors/hu/Humanizer 点击查看 免费下载 Human…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉