使用核心音频的代码是否可以跨iOS&;兼容;马科斯?
核心音频是iOS和macOS的音频框架。从中,我可以看出在实现上存在差异。最值得注意的似乎是示例格式(iOS为定点,macOS为32位浮点),iOS不支持核心音频的所有方面 当编写代码以实现两个平台都支持的功能时,是否可以编写一次代码并将其真正移植?如果答案是“是的,但仅在某些方面”,请进一步解释 让我们以实时音频合成为例。我想打开一个音频输出流,并使用回调方法将样本放入输出缓冲区。我知道这可以在iOS和macOS上实现,但当我查找库时,它们似乎并不同时支持这两个。这些库是否真的支持这两种平台,或者有什么根本原因阻止了这一点 例如:使用核心音频的代码是否可以跨iOS&;兼容;马科斯?,ios,macos,core-audio,Ios,Macos,Core Audio,核心音频是iOS和macOS的音频框架。从中,我可以看出在实现上存在差异。最值得注意的似乎是示例格式(iOS为定点,macOS为32位浮点),iOS不支持核心音频的所有方面 当编写代码以实现两个平台都支持的功能时,是否可以编写一次代码并将其真正移植?如果答案是“是的,但仅在某些方面”,请进一步解释 让我们以实时音频合成为例。我想打开一个音频输出流,并使用回调方法将样本放入输出缓冲区。我知道这可以在iOS和macOS上实现,但当我查找库时,它们似乎并不同时支持这两个。这些库是否真的支持这两种平台,
- for建议此库支持macOS,但不支持iOS
- 库文档支持macOS,但没有提到iOS
- iOS上的标准样本格式现在也是立体声浮点32
MacOS支持自定义v3和v2音频单元,而iOS支持自定义v3音频单元,但仅支持系统提供的v2音频单元
AVAudioEngine和朋友们用Swift/ObjC封装了大部分的核心音频C API,我相信平台之间没有什么区别。我建议先尝试AVAudioEngine,如果它不能满足您的需求,那么就使用C API
大部分C API都是跨平台的,但也有一些领域仅在macOS或iOS上受支持。您可以通过标题查看差异。例如,以下是输出音频单元子类型的定义(文档已删除)
如果要编写跨平台包装器,必须围绕平台细节使用预处理器指令。这是一个跨平台函数,它使用特定于平台的子类型为输出音频单元创建AudioComponentDescription
AudioComponentDescription outputDescription() {
AudioComponentDescription description;
description.componentType = kAudioUnitType_Output;
description.componentManufacturer = kAudioUnitManufacturer_Apple;
description.componentFlags = 0;
description.componentFlagsMask = 0;
#if TARGET_OS_IPHONE
description.componentSubType = kAudioUnitSubType_RemoteIO;
#else
description.componentSubType = kAudioUnitSubType_DefaultOutput;
#endif
return description;
}
其他一些音频单元仅在iOS或macOS上受支持,而管理“系统”级音频交互的API则完全不同。MacOS使用C API,而iOS使用音频
我肯定错过了一些东西:)谢谢,戴夫。你也证实了我的怀疑。新文档是最新的参考,但没有任何示例/示例/解释,而我引用的旧文档有解释,但已经过时。就我个人而言,我喜欢从
AVAudioEngine
开始,然后因为bug而损失一周左右的时间,最后用HALOutput
/RemoteIO
音频单元重写。我什么时候学习?
AudioComponentDescription outputDescription() {
AudioComponentDescription description;
description.componentType = kAudioUnitType_Output;
description.componentManufacturer = kAudioUnitManufacturer_Apple;
description.componentFlags = 0;
description.componentFlagsMask = 0;
#if TARGET_OS_IPHONE
description.componentSubType = kAudioUnitSubType_RemoteIO;
#else
description.componentSubType = kAudioUnitSubType_DefaultOutput;
#endif
return description;
}