转自: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

);

 
 

iOS 音频开发之CoreAudio的更多相关文章

  1. iOS音频开发之`AudioStreamBasicDescription`

    这个类提供了对于音频文件的描述 An audio stream is a continuous series of data that represents a sound, such as a so ...

  2. iOS多线程开发之GCD(中篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  3. iOS多线程开发之NSOperation - 快上车,没时间解释了!

    一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...

  4. iOS游戏开发之UIDynamic

    iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ...

  5. iOS多线程开发之NSOperation

    一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...

  6. iOS多线程开发之GCD(死锁篇)

    上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...

  7. iOS多线程开发之GCD(中级篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  8. Android音频开发之MediaRecorder/MediaPlayer

    前言: 上次我们介绍了实时采集音频数据以及播放,今天我们来认识一下直接录制文件的方式. 直接上代码:录制管理类 public class MediaRecorderManager { public s ...

  9. Android音频开发之AudioTrack实时播放

    前言: 其实在Android中录音可以用MediaRecord录音,操作比较简单.但是不能对音频进行处理.考虑到项目中做的是实时语音只能选择AudioRecord进行录音.然后实时播放也只能采用Aud ...

随机推荐

  1. HtmlSpanner 使用小结 -- 安卓解析html

    如何利用 HtmlSpanner解析 HTML格式 的字符串: 1. GitHub 下载HtmlSpanner项目 https://github.com/NightWhistler/HtmlSpann ...

  2. [转载]1.4 UiPath参数的介绍和使用

    一.参数介绍 用于将数据从一个项目传递到另一个项目.在全局意义上,它们类似于变量,因为它们动态地存储数据并传递给它.变量在活动之间传递数据,而参数在自动化之间传递数据.因此,它们使你能够一次又一次地重 ...

  3. git 设置不用每次都输入 账号密码

    执行命令 git config --global credential.helper store 然后,下次再输入一次 账号密码 就可以了.

  4. phpexcel导出数字带E的解决方法

    phpexcel导出数字带E的解决方法 excel之所以带E 是因为按照数字格式来显示了(数字过长的时候) 数字左边或者右边加空格就变成字符串了 那么excel就会按照字符串格式来显示了 就不会带E了

  5. CSS(7)--- 通俗讲解清除浮动

    CSS(7)--- 通俗讲解清除浮动 上一篇讲了CSS浮动 博客地址:CSS(6)---通俗讲解浮动(float) 一.理解清除浮动 1.为什么要清除浮动 我们前面说过,浮动本质是用来做一些文字混排效 ...

  6. [Office] VBA Practice

    1. 使用DateTimePicker控件 VBA中默认的User Form的Toolbox中的控件并不包含DateTimePicker,是接受时间相关数据的输入,在Toolbox上右击“Additi ...

  7. Look into Bitmap images

    What's a Bitmap image? I'm not going to explain the differences between raster and vector images, no ...

  8. [Error]Archive for required library: 'C:/Users/fk/.m2/repository/com/sun/xml/bind/jaxb-core/2.2.7/jaxb-core-2.2.7.jar'

    Eclipse报错: Description Resource Path Location Type Archive for required library: 'C:/Users/fk/.m2/re ...

  9. hdu 1817 Necklace of Beads (polya)

    Necklace of Beads Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  10. nyoj 75-日期计算 (闰年与平年的判断)

    75-日期计算 内存限制:64MB 时间限制:3000ms 特判: No 通过数:19 提交数:31 难度:1 题目描述: 如题,输入一个日期,格式如:2010 10 24 ,判断这一天是这一年中的第 ...