转自:http://www.cnblogs.com/javawebsoa/archive/2013/05/20/3089511.html
接 触过IOS音频开发的同学都知道,Core Audio 是IOS和 MAC 的关于数字音频处理的基础,它提供应用程序用来处理音频的一组软件框架,所有关于IOS音频开发的接口都是由Core Audio来提供或者经过它提供的接口来进行封装的,按照官方的说法是集播放,音频处理录制为一体的专业技术,通过它我们的程序可以同时录制,播放一个或 者多个音频流,自动适应耳机,蓝牙耳机等硬件,响应各种电话中断,静音,震动等,甚至提供3D效果的音乐播放。
Core Audio 的API结构分三层,如下图:
Low-Level 层是关于硬件接口的API层,这个层次的API主要是提供给MAC用来编写需要实时性能音频处理的接口,一般的应用程序都不会使用这一层次的 API,Core Audio为IOS这个移动平台提供了一个更高层次的API来处理实时音频,这个API更加紧凑,高效。
Mid-Level 层的功能比较齐全,包括音频数据格式转换,音频文件读写,音频流解析,插件工作支持等
Audio Convert Services API 负责音频数据格式的转换
Audio File Services API 负责音频数据的读写
Audio Unit Services 和 Audio Processing Graph Services 支持均衡器和混音器等数字信号处理的插件。
Audio File Scream Services 负责流解析
Core Audio Clock Services 负责音频音频时钟同步
High-Level层是一组从低层接口组合起来的高层应用,基本上我们很多关于音频开发的工作在这一层就可以完成
Audio Queue Services 提供录制、播放、暂停、循环、和同步音频它自动采用必要的编解码器处理压缩的音频格式。
AVAudioPlayer是专为IOS平台提供的基于Objective-C接口的音频播放类,可以支持iOS所支持的所有音频的播放。
OpenAL是CoreAudio对OpenAL标准的实现,可以播放3D混音效果。
CoreAudio 的API并不是封装成一个单独的framework,它的接口散落到不同的framework,例如:
AudioToolbox.framework提供coreAudio的中高级别的API服务,我们经常会打交道的AVAudioSession类就是包含在这个库中,用来处理应用程序的关于音频设备上下文的控制。通过它可以设置程序的音频能力,处理电话和其他高优先级语音处理而导致的中断和恢复操作等。
AudioUnit.framework这个库提供DSP数字信号处理相关的插件,包括编解码,混音,音频均衡等。
AVFoundation.framework这个库提供一个精简的音乐播放类,可以播放所有IOS支持的音频。
OpenAL.framework提供3D音效播放
CoreAudio在设计上主要采用属性对机制来管理和操作音频对象的状态和行为,我们在各个类中都能看这样的工作方式:
1、一个属性KEY通常是一个助记名字定义的枚举常量,比如 kAudioFilePropertyFileFormat或kAudioQueueDeviceProperty_NumberChannels。
2、一个属性value 通常是一个特定的适合于描述该属性的数据类型,例如void *,aFloat64,一个AudioChannel 数据结构等
CoreAudio通过访问函数来获取Key 对应的属性值,如果该属性值可写的话,还可以通过Key来修改key对应的属性,当然,CoreAudio也提供普通的接口来获取对象的值。例如通过kAudioSessionProperty_OverrideCategoryDefaultToSpeaker来设置程序音频切换成外放模式
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,
sizeof(audioRouteOverride), &audioRouteOverride);
CoreAudio
接口提供一个回调机制在音频对象的某个属性变化时候通知你的应用程序,应用程序在使用AudioQueue类进行音乐播放的时候,实现这个回调函数,并且
设置给AudioQueue对象,那么AudioQueue对象在执行完音频播放操作之后调用该函数。
typedef void (*AudioQueuePropertyListenerProc) (
void * inUserData,
AudioQueueRef inAQ,
AudioQueuePropertyID inID
);