当前位置:  开发笔记 > 编程语言 > 正文

uwp AudioGraph音频处理

如何解决《uwpAudioGraph音频处理》经验,为你挑选了1个好方法。

我正在开发一个基于音频输入控制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(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个LED*3(rgb)= 492个箱子.并进一步处理此数据以获得0到255之间的某些值.

那么如何处理这个float*或byte*来获取这个有用的数据呢?或者我该如何开始?



1> andymule..:

该数据是交错的IEEE浮点数,因此当您逐步遍历数组时,它会交替显示通道数据,每个样本的数据范围从-1到1.例如,单声道信号只有一个通道,因此它不会交错数据; 但立体声信号有两个音频通道,因此:

dataInFloat[0]

是左声道和第一个数据样本

dataInFloat[1]

是来自正确渠道的第一个数据样本.然后,

dataInFloat[2]

是来自左声道的第二个数据样本.他们只是来回走动.您最终关注的所有其他数据都在windows.media.mediaproperties.audioencodingproperties中

所以,只要知道这一点,你(本质上)可以立即直接从这些数据看,在每个样品的绝对值得到信号的总音量.你肯定想在一段时间内将其平均化.您甚至可以将EQ效果附加到不同的节点,并制作单独的低,中,高分析器节点,甚至不会进入FFT内容.但那有什么乐趣呢?(它实际上仍然很有趣)

然后,是的,为了获得复杂的谐波数据并制作出真正可爱的可视化器,您需要对其进行FFT.人们喜欢使用AForge来学习和你一样的学习场景.有关用法,请参阅Sources/Imaging/ComplexImage.cs,使用Sources/Math/FourierTransform.cs进行实现

然后,您可以轻松获取经典的bin数据,并制作经典的音乐可视化工具或获得更多创意或其他任何东西!技术太棒了!

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有