首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >uwp AudioGraph音频处理

uwp AudioGraph音频处理
EN

Stack Overflow用户
提问于 2016-01-10 14:45:47
回答 2查看 5.3K关注 0票数 8

我正在工作一个winodws IoT项目,它控制一个基于音频输入的led条。现在,我有一些代码可以获取音频并使用AudioGraph API将其写入缓冲区,但我不知道如何处理音频到一些有用的数据。

到目前为止我的代码是:

代码语言:javascript
运行
复制
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获得的数据是一个字节*,我可以将它转换成一个浮点数*如何将它从字节*或浮点数*转换成其他一些数据,我可以用来创建一些颜色代码。

我在浮点上做了一些FFT分析,得到164个leds*3(rgb) = 492个垃圾桶。并进一步处理这些数据,以获得0到255之间的一些值。

那么,我如何处理这个浮点*或字节*来获取这些有用的数据呢?或者我该怎么开始?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-27 00:02:29

该数据是交错的IEEE浮点,因此它在遍历数组时交替传输信道数据,每个示例的数据范围为-1到1。例如,单个信号只有一个通道,因此它根本不会交织数据;但是一个立体声信号有两个音频通道,因此:

代码语言:javascript
运行
复制
dataInFloat[0]

是来自左侧通道的第一个数据样本,并且

代码语言:javascript
运行
复制
dataInFloat[1]

是来自正确通道的数据的第一个示例。然后,

代码语言:javascript
运行
复制
dataInFloat[2]

是来自左侧通道的第二个数据示例。他们就不停地来回走。你所关心的所有其他数据都是在windows.media.mediaproperties.audioencodingproperties中

因此,只要知道这一点,您(本质上)就可以通过查看每个样本的绝对值,直接从这些数据中获得信号的整体体积。你一定要在一段时间内把它平均下来。您甚至可以将EQ效应附加到不同的节点上,使分离的Low、Mid和High分析器节点分离,甚至永远不会进入FFT的内容。但这有什么乐趣呢?(其实还是挺有趣的)

然后,是的,为了得到你的复杂谐波数据,并做出一个真正甜美的视觉效果,你想要对它做一个FFT。人们喜欢将AForge用于学习场景,就像您的情景一样。使用情况见源/成像/ComplexImage.cs,实现见源/数学/FourierTransform.cs

然后,您可以轻松地获得您的经典bin数据,并做经典音乐可视化的东西,或获得更多的creative或其他什么!科技太棒了!

票数 12
EN

Stack Overflow用户

发布于 2016-09-22 16:12:28

代码语言:javascript
运行
复制
  dataInFloat = (float*)dataInBytes;
  float max = 0;
   for (int i = 0; i < graph.SamplesPerQuantum; i++)
                {
                    max = Math.Max(Math.Abs(dataInFloat[i]), max);

                }

                finalLevel = max;
                Debug.WriteLine(max);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34706719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档