转自: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. 在react中配置less

    在创建项目之后执行 $ yarn eject 抽离配置文件 会多出config和script文件夹 接下来安装less yarn add less less-loader 或者 npm install ...

  2. nyoj 28-大数阶乘 (大数模板)

    28-大数阶乘 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:19 submit:39 题目描述: 我们都知道如何计算一个数的阶乘,可是,如果这个数 ...

  3. nyoj 125-盗梦空间 (数学ans += temp * 60 * pow(0.05, cnt))

    125-盗梦空间 内存限制:64MB 时间限制:3000ms 特判: No 通过数:8 提交数:10 难度:2 题目描述: <盗梦空间>是一部精彩的影片,在这部电影里,Cobb等人可以进入 ...

  4. 搭建Redis三主三从集群

    Redis三主三从集群规划 10.0.128.19   使用端口 7000  7001 10.0.128.22   使用端口 7002  7003 10.0.128.23   使用端口 7004  7 ...

  5. CentOs虚拟机配置

    1.打开“VMware”,点击“主页”,点“创建新的虚拟机”: 2.会弹出一个“新建虚拟机向导”,类型选择“典型”,点击“下一步”: 3.选择“稍后安装操作系统”,点击“下一步”: 4.我们用的是Li ...

  6. python:爬虫1——实战(下载一张图片、用Python模拟浏览器,通过在线的有道词典来对文本翻译)

    一.下载一只猫 import urllib.request response = urllib.request.urlopen("http://cdn.duitang.com/uploads ...

  7. boost.asio新框架的设计概念总结

    1.66版本,boost.asio库重新设计了框架,目前最新版为1.71.读了几天代码后,对框架中相关概念总结.因为是泛型编程的库,所以分析的概念层的设计. 可通过boost官方文档,strand的1 ...

  8. Error: invalid "instanceof" keyword value Promise的解决方法

    执行npm run dev 时,发现错误 Error: invalid "instanceof" keyword value Promise 经过一番查找,发现原因是webpack ...

  9. vue中router跳转本页刷新

    问题:  导航栏的地址发生改变但是页面却不刷新  (用vue-router路由到当前页面,页面是不进行刷新的)解决: 1.);           2.location.reload()       ...

  10. Java流程控制之(四)中断

    目录 break continue return 标签 在程序设计时,循环直接的跳转显得十分重要,虽然Java没有提供goto语句去控制程序的跳转,但为了控制循环,Java提供了continue,br ...