我对这三个概念感到困惑
我正在研究ios上的音频项目,尽管我是关于目标c和c的新手。 我试图获得音频数据的实时fft。
在这个过程中,我对这三个概念感到非常困惑。 -maximumFramesPerSlice, -inNumberFrames渲染函数的变量 - 在AVAudioSession
上设置的首选I / O硬件缓冲持续时间我将缓冲持续时间设置为100 ms。虽然我希望InNumberFrames以44.1khz的采样率获得4410个样本/帧,但每次渲染(回调)总是会带来470-471帧。虽然我对这两者感到困惑,但现在另一个变量出来了。 maximumFramesPerSlice?
它的默认值是4096。 在coreAudio词汇表中说 “slice:在音频单元的一个渲染周期中请求和处理的帧数”
为什么每次渲染时会出现470帧。
我将非常感谢任何帮助
答案 0 :(得分:3)
iOS中的缓冲持续时间仅是首选持续时间。操作系统可能会尝试使用接近此配置首选项的值,但可以自由使用不同的持续时间(基于当前设备硬件功能,设备状态,其他运行音频应用程序和操作系统版本等) ,甚至在应用程序运行时更改此持续时间(例如在显示“锁定”时增加它)。
因此iNumberOfFrames除以采样率是当前回调中呈现的音频数据的实际持续时间。此持续时间可以在连续的回调之间变化。操作系统选择此持续时间,而不是应用程序。该应用仅建议偏好。
如果实际缓冲区大小大于maximumFramesPerSlice,音频单元将返回错误,因此maximumFramesPerSlice最好保留在4096,以防止您的应用在显示器被锁定时发生崩溃和/或其他事情发生涉及您之外的操作系统应用
每帧470到471个样本表明实际的硬件ADC芯片运行在48000 sps,512个样本的DMA缓冲区到处理器,操作系统在44100处重新采样到470.x样本,然后将结果交给你的应用程序