音频单元采样率和缓冲区大小

时间:2012-01-05 08:08:52

标签: objective-c xcode core-audio audio-recording

在使用remoteIO对iphone音频进行采样时,我面临着一个非常误解的问题。

从一方面来说,我可以做这个数学:44khz采样率意味着每1ms 44个样本。这意味着如果我使用:

将bufferSize设置为0.005
float bufferLength = 0.00005;
     AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferLength), &bufferLength);

表示5ms的缓冲区大小 - 这意味着44 * 5 =每个回调缓冲区中的220个样本。 但我从每个回调inNumberFrames获得512个样本。并且即使我改变缓冲区长度也保持固定。

另外一件事,我的回调是每11毫秒而且没有改变!我需要更快的回调。

所以! 这里发生了什么 ? 谁设定了什么?

我需要在FSK调制中传递数字信息,并且必须准确知道样本中的缓冲区大小,以及信号的时间,以便知道如何正确地进行FFT。

对此有何解释? 非常感谢。

3 个答案:

答案 0 :(得分:4)

目前所有iOS 10设备都没有办法以比每5到6毫秒更快的速度获得RemoteIO音频录制缓冲区回调。操作系统甚至可能决定在运行时以较低的回调速率切换到发送更大的缓冲区。您请求的速率仅仅是一个请求,然后操作系统决定硬件,设备驱动程序和设备状态可能的实际速率。此费率可能会也可能不会保持不变,因此您的应用只需处理不同的缓冲区大小和费率。

您的一个选择可能是将每个回调缓冲区连接到您自己的缓冲区,并在音频回调之外切换第二个缓冲区。但这不会减少实际延迟。

答案 1 :(得分:3)

  

我需要在FSK调制中传递数字信息,并且必须准确知道样本中的缓冲区大小,以及信号的时间,以便知道如何正确地进行FFT。

它不起作用 - 您不要求各种主机或硬件以精确的方式运行,这对您的处理是最佳的。您可以要求减少延迟 - 达到一定程度。音频系统通常以大小为2的幂的样本块传递流式pcm数据,以实现高效的实时性。

您可以为处理器创建自己的缓冲区,并报告延迟(如果适用)。您可以尝试通过选择其他采样率或使用较小的N来减少墙延迟。

答案 2 :(得分:1)

音频会话属性是建议值。您可以输入一个非常小的数字,但只会达到它可以达到的最低值。使用16位立体声时,我在iOS设备上看到的最快速度是0.002902 second(~3ms)。

每次回调即128个样本(LR立体帧)。因此,每回调512字节。 所以128/44100 = 0.002902 seconds

您可以查看:

AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &bufferDuration)

原帖中的值512是否意味着字节而不是样本?