转自: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. Linux 常用命令 | top 详解

    top 命令实时显示进程的状态.(自己也会占用资源,类似window的任务管理器),由以下几部分组成 默认状态显示的是cpu密集型的进程,并且每5秒钟更新一次. (1) 系统状态 当前时间.系统已运行 ...

  2. [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL

    此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper支持.net framework4.6.1及 ...

  3. 【Swift】UNNotificationServiceExtension

    一.简介 An object that modifies the content of a remote notification before it's delivered to the user. ...

  4. python快速获取网页标准表格内容

    from html_table_parser import HTMLTableParser def tableParse(value): p = HTMLTableParser() p.feed(va ...

  5. Error response from daemon ... no space left on device docker启动容器服务报错

    docker 启动容器服务的时候,报错no space left on device 1. 检查磁盘是否用光 3.检查inode是否耗光,从截图看到是inode耗光导致出现问题: 进入到/run里面看 ...

  6. python3 控制安卓手机的飞行模式遇到的问题汇总

    一.首先调通电脑对手机能落实 adb shell命令 验证通过标准:控制wifi开关的命令,能让wifi功能开启和关闭 (adb shell svc wifi enable   和   adb she ...

  7. a 标签添加 onclick 事件

    a 标签添加 onclick 事件 <a href="javascript:void(0);" οnclick="js_method()">点击&l ...

  8. pug参考文档

    1. API express框架的渲染模板有多种选择,官方的例子是Pug,网上找了一下,Pug没有可以参考的中文文档,于是自己动手丰衣足食.翻译水平一般,各位凑合着看吧. 1.1 开始 安装 通过np ...

  9. ubuntu触摸板双指滑动,页面滚动方向

    setting——mouse & Touchpad——Natural scrolling 跟我的另一台本子一样了-

  10. 稀疏数组 python描述

    什么是稀疏矩阵? 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵. 作用: 在这种情况下,很多0值无疑是很浪费空间的,当我们要把数组存储在磁盘中 ...