【问题标题】:Adjust the length of an AudioUnit Buffer调整 AudioUnit Buffer 的长度
【发布时间】:2011-06-19 07:09:51
【问题描述】:

我的问题与 AudioUnits 有关。为了设计一个用于 iPhone 的变声应用程序(使用 Objective-C xCode),我使用了这个网站上的 RemoteIO audioUnit 示例:

http://atastypixel.com/blog/using-remoteio-audio-unit/

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

float aBufferLength = 0.005; // In seconds
AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, 
                        sizeof(aBufferLength), &aBufferLength);

现在我的具体问题:上面的代码不适合提到的audioUnit,因为没有使用AudioSession,从未初始化,因此会产生错误。 除了“kAudioSessionProperty_PreferredHardwareIOBufferDuration”之外,还有其他调整缓冲区持续时间的可能性吗? 在这种情况下,文档不是很有用...... 在此先感谢 Lukas。

【问题讨论】:

  • 我已在回复中添加了相关代码。

标签: iphone buffer duration audiounit


【解决方案1】:

使用RemoteIO Audio-Unit 定义和初始化AudioSession 没有问题,这就是设置所需缓冲区长度的方法。我有一些代码可以做到这一点,但是我需要几个小时才能回家并发布它。你可以看看苹果的AurioTouch code-sample,或者等我稍后再发。

无论如何要记住两件事:

  1. 缓冲区长度只会在设备上改变,所以如果你改变它并且在模拟器上看不到任何差异,请不要感到惊讶。
  2. 你不能得到任何你想要的缓冲区长度——这就是为什么这个属性被称为PreferredHardwareIOBufferDuration。缓冲区大小始终是 2 的幂。

考虑到这一点,您是否考虑过分配自己的缓冲区并将其累积直到获得所需数量的样本?

编辑

初始化音频会话的代码(应该在音频单元初始化之前):

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

您可以/应该在每次调用后检查 result 以查找可能的错误。 您可以阅读 AudioSessionInitialize 的文档以获取更多信息,但为所有 4 个参数传递 NULL 仍然有效。例如,如果需要建立中断侦听器回调,则应更改它。

【讨论】:

  • 感谢您的有用回答!我将立即对其进行测试并发布我的经验。但是我很难相信缓冲区长度只会在设备上发生变化......如果连续函数需要一个长缓冲区作为输入怎么办?这是否意味着它不能在模拟器中正常工作,但在 iphone 上工作正常?
  • successive function 是什么意思?无论如何,音频硬件并不关心您的需求 - 它所知道的只是要求您在需要时给它 N 个样本以播放(在播放回调中),或者为您提供 N 个样本供您处理(在记录中打回来)。如果你需要更多,你应该积累并等到你有足够的时候。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 2013-08-28
  • 2023-03-22
相关资源
最近更新 更多