【发布时间】:2016-01-03 17:57:49
【问题描述】:
我想构建一个 SoundWave 对音频流进行采样。
我读到一个很好的方法是获取音频流的幅度并用多边形表示它。但是,假设我们的 AudioGraph 只有一个 DeviceInputNode 和一个 FileOutpuNode(一个简单的记录器)。
如何从 AudioGraph 的节点获取振幅?
对此采样进行周期化的最佳方法是什么? DispatcherTimer 是否足够好?
我们将不胜感激。
【问题讨论】:
我想构建一个 SoundWave 对音频流进行采样。
我读到一个很好的方法是获取音频流的幅度并用多边形表示它。但是,假设我们的 AudioGraph 只有一个 DeviceInputNode 和一个 FileOutpuNode(一个简单的记录器)。
如何从 AudioGraph 的节点获取振幅?
对此采样进行周期化的最佳方法是什么? DispatcherTimer 是否足够好?
我们将不胜感激。
【问题讨论】:
首先,您关心的一切都在这里: uwp AudioGraph audio processing
但由于你的出发点不同,我会解释一些更核心的东西。
AudioGraph 节点已经为您分期了——这通常是音频的工作方式。我认为 Win10 默认为 10 毫秒和/或 20 毫秒的周期,但这可以通过 AudioGraphSettings.DesiredSamplesPerQuantum 设置(理论上)设置,使用 AudioGraphSettings.QuantumSizeSelectionMode = QuantumSizeSelectionMode.ClosestToDesired;我相信此功能的成功实际上取决于您的音频硬件,而不是具体的操作系统。我的电脑只能做480和960。这个数字是每个通道要累积多少个音频信号的样本(单声道是一个通道,立体声是两个通道等...),这个数字也会设置回调时间为一种副产品。
Win10 和大多数设备默认为 48000Hz 采样率,这意味着它们每秒测量/输出数据很多次。因此,对于每帧音频,我的 QuantumSize 为 480,我每秒获得 48000/480 或 100 帧,这意味着我默认每 10 毫秒获得一次。如果将量子设置为每帧 960 个样本,则每秒将获得 50 帧,或每 20 毫秒获得一帧。
要在每个量程中回调该音频帧,您需要在 AudioGraph.QuantumProcessed 处理程序中注册一个事件。您可以直接参考上面的链接了解如何操作。
所以默认情况下,一帧数据存储在一个由 [-1,+1] 开始的 480 个浮点数组成的数组中。要获得幅度,您只需平均这些数据的绝对值。
这部分,包括处理多个音频通道,在我的另一篇文章中有更详尽的解释。
玩得开心!
【讨论】: