Objective c 音频单位采样率和缓冲区大小

Objective c 音频单位采样率和缓冲区大小,objective-c,xcode,core-audio,audio-recording,Objective C,Xcode,Core Audio,Audio Recording,在使用remoteIO对iphone音频进行采样时,我遇到了一个真正的误解 从一方面来说,我可以做这个数学:44khz采样率意味着每1ms 44个采样。这意味着如果我使用以下参数将bufferSize设置为0.005: float bufferLength = 0.00005; AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferLength), &a

在使用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

对此有何解释? 非常感谢

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

它不是这样工作的——您不需要强制各种主机或硬件以适合您处理的精确方式运行。您可以请求将延迟减少到一定程度。音频系统通常以2次方大小的采样块传递流式pcm数据,以实现高效的实时io

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

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

它不是这样工作的——您不需要强制各种主机或硬件以适合您处理的精确方式运行。您可以请求将延迟减少到一定程度。音频系统通常以2次方大小的采样块传递流式pcm数据,以实现高效的实时io


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

在所有当前的iOS 10设备上,无法以比每5到6毫秒更快的速率获取RemoteIO音频录制缓冲区回调。操作系统甚至可能决定在运行时以更低的回调速率发送更大的缓冲区。您请求的速率仅仅是一个请求,然后操作系统决定硬件、设备驱动程序和设备状态可能的实际速率。这个速率可能是固定的,也可能不是固定的,所以你的应用程序只需要处理不同的缓冲区大小和速率

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


添加:一些较新的iOS设备允许返回持续时间小于5.x毫秒的音频单元缓冲区,通常在48000采样率下为2次幂。

在所有当前的iOS 10设备上,都无法以比每5到6毫秒更快的速率获取RemoteIO音频录制缓冲区回调。操作系统甚至可能决定在运行时以更低的回调速率发送更大的缓冲区。您请求的速率仅仅是一个请求,然后操作系统决定硬件、设备驱动程序和设备状态可能的实际速率。这个速率可能是固定的,也可能不是固定的,所以你的应用程序只需要处理不同的缓冲区大小和速率

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


添加:一些较新的iOS设备允许返回持续时间小于5.x mS的音频单元缓冲区,通常在48000采样率下大小为2次方。

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

即每个回调128个采样(LR立体声帧)。因此,每个回调有512字节。 因此
128/44100=0.002902秒

您可以通过以下方式进行检查:

AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &bufferDuration)

原始post中的值512是否表示字节而不是样本?

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

即每个回调128个采样(LR立体声帧)。因此,每个回调有512字节。 因此
128/44100=0.002902秒

您可以通过以下方式进行检查:

AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &bufferDuration)

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

float bufferLength=0.00005将是50µs,而不是5 ms-这太小了。这是我的错误,我已经更改了它。它应该是0.005,问题中仍然是0.00005,如果这不正确,那么您需要点击
编辑
按钮并修复它
浮动缓冲长度=0.00005将是50µs,而不是5 ms-这太小了。这是我的错误,我已经更改了它。它应该是0.005,问题中仍然是0.00005-如果这不正确,那么您需要点击
编辑
按钮并修复它。什么是N?如果我降低采样率,我的回调会更快吗?我可以将采样率降低到10khz。那么我的回电会更快吗?现在是11毫秒。这对我来说太慢了。我已经将采样率降低到22100,有时每11ms,有时每6ms就收到一次回调。它甚至不接近于固定的。我只需要一个固定的时间回调-约1毫秒,与戈尔泽尔alg