【发布时间】:2016-04-14 21:17:55
【问题描述】:
我正在开发一个基于音频输入控制 LED 灯条的 winodws IoT 项目。现在我有一些代码可以将音频输入并使用 AudioGraph API 将其写入缓冲区,但我不知道如何将音频处理为一些有用的数据。
到目前为止我的代码:
private async void MainPage_Loaded(object sender, RoutedEventArgs eventArgs)
{
try
{
// Initialize the led strip
//await this.pixelStrip.Begin();
sampleAggregator.FftCalculated += new EventHandler<FftEventArgs>(FftCalculated);
sampleAggregator.PerformFFT = true;
// Create graph
AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Media);
settings.DesiredSamplesPerQuantum = fftLength;
settings.DesiredRenderDeviceAudioProcessing = Windows.Media.AudioProcessing.Default;
settings.QuantumSizeSelectionMode = QuantumSizeSelectionMode.ClosestToDesired;
CreateAudioGraphResult result = await AudioGraph.CreateAsync(settings);
if (result.Status != AudioGraphCreationStatus.Success)
{
// Cannot create graph
return;
}
graph = result.Graph;
// Create a device input node using the default audio input device
CreateAudioDeviceInputNodeResult deviceInputNodeResult = await graph.CreateDeviceInputNodeAsync(MediaCategory.Other);
if (deviceInputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
{
return;
}
deviceInputNode = deviceInputNodeResult.DeviceInputNode;
frameOutputNode = graph.CreateFrameOutputNode();
frameOutputNode.Start();
graph.QuantumProcessed += AudioGraph_QuantumProcessed;
// Because we are using lowest latency setting, we need to handle device disconnection errors
graph.UnrecoverableErrorOccurred += Graph_UnrecoverableErrorOccurred;
graph.Start();
}
catch (Exception e)
{
Debug.WriteLine(e.ToString());
}
}
private void AudioGraph_QuantumProcessed(AudioGraph sender, object args)
{
AudioFrame frame = frameOutputNode.GetFrame();
ProcessFrameOutput(frame);
}
unsafe private void ProcessFrameOutput(AudioFrame frame)
{
using (AudioBuffer buffer = frame.LockBuffer(AudioBufferAccessMode.Write))
using (IMemoryBufferReference reference = buffer.CreateReference())
{
byte* dataInBytes;
uint capacityInBytes;
float* dataInFloat;
// Get the buffer from the AudioFrame
((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes, out capacityInBytes);
dataInFloat = (float*)dataInBytes;
}
}
所以我以我的缓冲区作为浮点数结束。但是我怎样才能将其更改为有用的数据,从而可以创建像频谱分析仪这样的东西呢?
编辑:
也许我必须让这个问题对听力图不那么具体。我使用 API 来获取我的音频输入。我从 API 获得的数据是一个字节*,我可以将其转换为浮点数* 如何将其从字节*或浮点数*更改为可用于创建一些颜色代码的其他数据。
我想对 float* 进行一些 FFT 分析以获得 164 个 LED*3(rgb) = 492 个 bin。并进一步处理这些数据以获得 0 到 255 之间的一些值。
那么我该如何处理这个 float* 或 byte* 来获取这些有用的数据呢?或者我该如何开始?
【问题讨论】:
-
你可以看看github.com/filoe/cscore,里面有一个示例(见下图)
标签: c# .net audio uwp windows-10-iot-core