繁体   English   中英

在 C# Xamarin.iOS 中将 AVAudioPcmBuffer 音频数据读取为 float[]

[英]Read AVAudioPcmBuffer audio data as a float[] in C# Xamarin.iOS

我正在尝试将音频数据从AVAudioPCMBuffer读取到一个float值数组中。 以下是我为此目的创建的扩展方法:

public static float[] ToFloatArray(this AVAudioPcmBuffer pcmBuffer)
{
    if ((pcmBuffer != null) && 
        (pcmBuffer.FloatChannelData != IntPtr.Zero))
    {
        int length = (Convert.ToInt32(pcmBuffer.FrameLength) * 2);
        if (length > 0)
        {
            var data = new float[length];
            Marshal.Copy(pcmBuffer.FloatChannelData, data, 0, length);
            return data;
        }
        else return new float[0];
    }
    else return null;
}

该方法似乎返回了适当长度的数据(8820 个样本,采样率为 44100),但是这些值似乎没有意义,其中许多是NaN

下面是在Marshal.Copy操作之后对上述方法中data的快速Marshal.Copy

QuickWatch 从 AVAudioPcmBuffer 输出数据

我本来打算使用float[]值来创建一个 VU 表,但是在实时监控时,这些值似乎并没有随着麦克风输入而发生显着变化,我也不明白为什么许多值包含Not a Number ( NaN )。

我知道AVAudioPcmBuffer包含有效的音频数据,因为我通过Append(AVAudioPcmBuffer audioPcmBuffer)发送到SFSpeechAudioBufferRecognitionRequest ,并且语音识别工作正常。

我怀疑Marshal.Copy可能复制了错误的数据。 有人可以确认这一点,和/或提供从 C# Xamarin for iOS 中的AVAudioPcmBuffer访问float[]值的正确方法吗?

FloatChannelData返回一个指向浮点指针的指针,而不是单个指针。 所以你需要取消引用float **才能到达你的float * 因此,假设在您的示例中您正在处理单声道,您只需要更改:

Marshal.Copy(pcmBuffer.FloatChannelData, data, 0, length)

Marshal.Copy(pcmBuffer.FloatChannelData[0], data, 0, length)

FloatChannelData是指向通道的指针,因此要获取字节,您需要这样做 -

var channels = (IntPtr*)buffer.FloatChannelData.ToPointer();
Marshal.Copy(channels[0], data, 0, length);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM