![](/img/trans.png)
[英]C# MonoTouch/Xamarin.iOS - AVPlayer Streamed Audio Buffer Start Point
[英]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
:
我本來打算使用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.