Iphone 调整音频单元缓冲区的长度

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_

我的问题与音响设备有关。为了设计一款适用于iPhone的语音更改应用程序(使用Objective-C xCode),我使用了本网站的RemoteIO audioUnit示例:

音频单元缓冲区设置为256个样本的长度。对于我的项目,我需要更多(约22050)。 引用的页面说明audioUnit缓冲区的长度可以如下调整:

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);