您可以使用
kAudioSessionProperty_CurrentHardwareIOBufferDuration
属性来表示缓冲区大小(以秒为单位)。将此乘以从
kAudioSessionProperty_CurrentHardwareSampleRate
得到的采样率,即可得到应该缓冲的样本数。
得到的缓冲区大小应该是2的倍数。我认为您可能会得到512或4096,但您应该始终基于从
AudioSessionGetProperty
返回的值进行计算。
例如:
Float64 sampleRate;
UInt32 propSize = sizeof(Float64);
AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate,
&propSize,
&sampleRate);
Float32 bufferDuration;
propSize = sizeof(Float32);
AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration,
&propSize,
&bufferDuration);
UInt32 bufferLengthInFrames = sampleRate * bufferDuration;
下一步是找出你要发送音频的单元的输入流格式。根据你的描述,我假设你正在编程生成音频并将其发送到扬声器。这段代码假定“unit”是你要发送音频的“AudioUnit”,无论是RemoteIO还是类似效果音频单元。
AudioStreamBasicDescription inputASBD;
UInt32 propSize = sizeof(AudioStreamBasicDescription);
AudioUnitGetProperty(unit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
0,
&inputASBD,
&propSize);
此后,
inputASBD.mFormatFlags
将成为一个位字段,对应于
unit
所期望的音频流格式。最可能的两组标志是
kAudioFormatFlagsCanonical
和
kAudioFormatFlagsAudioUnitCanonical
。这两个都有相应的样本类型
AudioSampleType
和
AudioUnitSampleType
,您可以根据此计算大小。
另外,
AudioSampleType
通常代表来自麦克风或目标扬声器的样本,而
AudioUnitSampleType
通常用于旨在处理的样本(例如,由音频单元)。目前在iOS上,
AudioSampleType
是SInt16,
AudioUnitSampleType
是存储在SInt32容器中的固定8.24数字。
这里是Core Audio邮件列表上关于这个设计选择的帖子
我不建议像“只使用Float32,它会起作用”的做法,因为如果Apple觉得合适,流的实际位表示可能会发生更改。
bufferSizeBytes
将等于sampleRate * bufferDuration * sizeof(Float32)
(假设单个样本值为4字节)?还有一件我有点模糊的事情,但是你能说bufferLengthInSamples = bufferLengthInFrames
吗(即使我们使用立体声音频,即1帧=2个样本)? - abbood