簡體   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