![](/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.