我使用0.0001
设置了AVAudioSession
秒的首选缓冲持续时间,并且未使用模拟器获取逻辑结果。
[session setPreferredIOBufferDuration:self.bufferDuration error:&audioSessionError];
if (audioSessionError) {
NSLog(@"Error %ld, %@",
(long)audioSessionError.code, audioSessionError.localizedDescription);
}
问题在于,在我的Audio Unit
渲染回调中,我总是将512
个帧作为inNumberFrames
参数进行处理。
在我的设备上,设置首选缓冲区持续时间会导致不同的缓冲区速率。例如,如果我设置self.bufferDuration
然后将AVAudioSession
设置为0.1
,那么我的渲染回调将获得4096
个inNumberFrames
个参数。在模拟器上,它将是512。
我想检查这是否是正常行为(我知道许多事情在模拟器和设备上的工作方式不同),或者这是我假设的问题。
答案 0 :(得分:2)
请注意,setPreferredIOBufferDuration设置只是首选建议而非硬设置。操作系统在运行时可以自由选择要发送到音频回调的多个帧(实际数据的持续时间乘以采样率),甚至在应用程序在前台运行音频时更改该数字。实际持续时间可能因iOS设备和Mac系统而异。持续时间还可能取决于采样率或格式,音频路由,是否存在当前活动的任何其他后台应用程序音频会话,前一个应用程序使用的音频设置,和/或OSX或iOS版本和版本iOS模拟器。
对于请求的缓冲持续时间0.0053,我似乎在iOS 9.2模拟器上获得512帧,在iPhone 6s上获得256帧(只有后者符合请求,但这将不是在所有常见抽样率下都是如此)。某些较旧的iOS设备不会返回低于256的帧数。
假设inNumberFrames将对应于应用程序的首选缓冲持续时间设置,则无效。