ios - 在 iOS 中使用 OpenAL 进行混响

标签 ios openal

<分区>

自 iOS 5 起,我们在 OpenAL 中支持混响效果,但我找不到任何使用此功能的好示例。我只找到了一些ObjectAL源代码的链接,但它太复杂了,无法理解混响效果的用法。 那么,如何使用OpenAL向iOS应用添加混响效果呢?

最佳答案

ObjectAL 代码库已经变得相当复杂,但在 OpenAL 方面,它实际上只是 C API 的一个大包装。混响的主要 Objective-C API 入口点是:

https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/OpenAL/ALListener.m#L194

https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/OpenAL/ALSource.m#L808

如果你想自己实现它,你首先需要像我在+[ALWrapper初始化]:https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/OpenAL/ALWrapper.m#L1363中那样绑定(bind)扩展函数。

所有混响功能的核心都是通过调用 alcASASetListener() 和 alcASASetSource() 来完成。如果您在 ALWrapper 中搜索这些函数,您会发现它只是将调用包装在 Objective-C 中(加上一些错误处理),而 ALSource 和 ALListener 正在包装它。在最低级别,它只是一堆此类调用:

alcASASetSource(ALC_ASA_REVERB_SEND_LEVEL, sourceID, &value, sizeof(value));

因此代码将始终遵循以下两条路径之一:

  • ALSource -> ALWrapper -> 对 alcASASetSource() 的原始 C 调用
  • ALListener -> ALWrapper -> 对 alcASASetListener() 的原始 C 调用

全局控件(通过监听器控制)是:

  • 打开/关闭混响(全局)
  • 全局混响级别(混响效果的响度)
  • 房间类型(提供各种预设,例如 ALC_ASA_REVERB_ROOM_TYPE_Cathedral)
  • EQ 增益、带宽、频率(基本过滤,使用方式与使用物理均衡器相同 - 如果有的话,您可能不会使用这么多)

本地控件(通过源控制)是:

  • 混响发送级别(混响影响此源的程度)
  • 混响遮挡(模拟听者和声源之间声音可以部分穿过的物理对象,例如门或薄墙)
  • 混响阻碍(模拟听者和声源之间不传导声音的物理对象,这样您只能听到它周围的声音,例如混凝土柱)

我还在这里写了一个小演示: https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectALDemo/Demos/ReverbDemo.m

据我所知,Apple 尚未发布太多文档,因此您最好的选择是克隆存储库、构建演示并使用 API,直到您了解它的工作原理一起。然后,需要将您使用 ObjectAL 所做的事情转换为对 alcASASetListener() 及其 friend 的实际调用,但这些应该是非常直接的转换,因为它最终只是包装代码。

关于ios - 在 iOS 中使用 OpenAL 进行混响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12782758/

上一篇:objective-c - 使用带有pop over的drawRect,需要显示图像

下一篇:ios - UIWindow rootviewcontroller - 方向错误

相关文章:

ios - iOS7 CAShapeLayer 动画问题

ios - 在应用程序关闭之前,Core Data 不会保存数据

iphone - AudioSession 实际上和 OpenAL 是一样的吗?

iphone - OpenAL 泄漏- OALSource :AddPlaybackMessage

iphone - iPhone游戏中的音效

ios - 按日期解析的有组织的组合数组

ios - 为什么当我返回时我的主视图 Controller 不更新?

iphone - iOS : SA_OAuthTwitterController callback after authorization

java - 如何将音频流式传输到 OpenAL Sources?

IOS 8 : Real Time Sound Processing and Sound Pitching - OpenAL or another framework