Iphone 调整音频单元缓冲区的长度
我的问题与音响设备有关。为了设计一款适用于iPhone的语音更改应用程序(使用Objective-C xCode),我使用了本网站的RemoteIO audioUnit示例: 音频单元缓冲区设置为256个样本的长度。对于我的项目,我需要更多(约22050)。 引用的页面说明audioUnit缓冲区的长度可以如下调整:Iphone 调整音频单元缓冲区的长度,iphone,buffer,duration,audiounit,Iphone,Buffer,Duration,Audiounit,我的问题与音响设备有关。为了设计一款适用于iPhone的语音更改应用程序(使用Objective-C xCode),我使用了本网站的RemoteIO audioUnit示例: 音频单元缓冲区设置为256个样本的长度。对于我的项目,我需要更多(约22050)。 引用的页面说明audioUnit缓冲区的长度可以如下调整: float aBufferLength = 0.005; // In seconds AudioSessionSetProperty(kAudioSessionProperty_
float aBufferLength = 0.005; // In seconds
AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration,
sizeof(aBufferLength), &aBufferLength);
现在我的具体问题是:上面的代码不适用于上述audioUnit,因为AudioSession未使用,从未初始化,因此会产生错误。
除了“kAudioSessionProperty\u PreferredHardwareIOBufferDuration”之外,是否还有其他可能调整缓冲区持续时间?
在这种情况下,文档不是很有用。。。
提前感谢您,Lukas。使用
RemoteIO
音频单元定义和初始化AudioSession
没有问题,这就是设置所需缓冲区长度的方法。我有一些代码可以完全做到这一点,但我需要几个小时才能回家并发布它。你可以看看苹果的,或者等我稍后发布
无论如何,请记住两件事:
PreferredHardwareIOBufferDuration
。缓冲区大小始终是2的幂结果
,以查找可能的错误。
您可以阅读
AudioSessionInitialize
的文档以了解更多信息,但是为所有4个参数传递NULL
仍然有效。例如,如果您需要建立中断侦听器回调,则应更改它。我已在响应中添加了相关代码。感谢您提供的有用答案!我会立即测试它并发布我的经验。但我很难相信缓冲区长度只会在设备上改变。。。如果连续函数需要一个长缓冲区作为输入,该怎么办?这是否意味着它在模拟器中不能正常工作,但在iphone上却可以正常工作?你所说的连续功能是什么意思?无论如何,音频硬件并不关心您的需要-它所知道的只是要求您在需要时为其提供N个播放样本(在播放回调中),或提供N个样本供您处理(在录制回调中)。如果你需要更多,你应该积累并等待,直到你有足够的。
OSStatus result;
result = AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;
result = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory);
// set preferred buffer size
Float32 preferredBufferSize = .04; // in seconds
result = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize);
// get actuall buffer size
Float32 audioBufferSize;
UInt32 size = sizeof (audioBufferSize);
result = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &audioBufferSize);
result = AudioSessionSetActive(true);