iOS 音频开发之CoreAudio
转自: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层是一组从低层接口组合起来的高层应用,基本上我们很多关于音频开发的工作在这一层就可以完成
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的更多相关文章
- iOS音频开发之`AudioStreamBasicDescription`
这个类提供了对于音频文件的描述 An audio stream is a continuous series of data that represents a sound, such as a so ...
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- iOS多线程开发之NSOperation - 快上车,没时间解释了!
一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...
- iOS游戏开发之UIDynamic
iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ...
- iOS多线程开发之NSOperation
一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...
- iOS多线程开发之GCD(死锁篇)
上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...
- iOS多线程开发之GCD(中级篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- Android音频开发之MediaRecorder/MediaPlayer
前言: 上次我们介绍了实时采集音频数据以及播放,今天我们来认识一下直接录制文件的方式. 直接上代码:录制管理类 public class MediaRecorderManager { public s ...
- Android音频开发之AudioTrack实时播放
前言: 其实在Android中录音可以用MediaRecord录音,操作比较简单.但是不能对音频进行处理.考虑到项目中做的是实时语音只能选择AudioRecord进行录音.然后实时播放也只能采用Aud ...
随机推荐
- 迁移桌面程序到MS Store(11)——应用SVG图标
在传统桌面程序中,对图标的使用大多是直接嵌入JPG或者PNG的图片.在祖传的1366x768分辨率下,并没有什么问题.相对于手机硬件的突飞猛进,也侧面反映了PC行业的落寞和桌面程序开发的不思进取.用3 ...
- 常用样式积累-scss
/** * author ctj -- 自定义公用样式 */ /*清除浮动*/ .clearfix:after { height:; content: ''; display: block; clea ...
- PHP结合SQL语句写一句话木马
一.基础类的一句话--功能仅限于验证漏洞了,实际中太容易被查出出来: 1 <?php @eval($_GET["code"])?> 2 <?php @system ...
- vue之注册自定义的全局js方法
前端开发的时候,总会需要写一些js方法,在vue框架中为了方便使用,可以考虑注册一个全局的js方法,下面是注册步骤: 1.0 可以在assets文件中的js文件下面新建一个js文件,如:yun.js- ...
- Linux基础知识回顾
1.描述计算机的组成及其功能 计算机是由计算机软件系统和计算机硬件系统两大系统组成 计算机硬件组成 1946年数学家冯诺依曼提出,计算机硬件由运算器.控制器.存储器.输入设备和输出设备5大部件组成,如 ...
- Nginx使用反向代理实现负载均衡
Nginx使用反向代理实现负载均衡 yls 2019-9-20 简介 基于docker容器以及docker-compose,所以需要自学docker在linux环境的基本使用 使用两个tomcat作为 ...
- Mybatis实现数据的增删改查
Mybatis实现数据的增删改查 1.项目结构(使用maven创建项目) 2.App.java package com.GetcharZp.MyBatisStudy; import java.io.I ...
- GCD 面试题
今天我们讲解几道这两天遇到的面试题--GCD编程的.题目很不错,很考究关于GCD的基本概念和使用. 对于基本的概念,本人博客已在前面讲过,本篇主要以面试题来讲解.大家可看一下本人关于GCD的基本讲解 ...
- set map symbol
set 声明 let set = new Set();即创建了一个空的set 赋值 let set = new Set(['张三','李四','王五']); 特性 似于数组,但它的一大特性就是所有元素 ...
- 领扣(LeetCode)七进制数 个人题解
给定一个整数,将其转化为7进制,并以字符串形式输出. 示例 1: 输入: 100 输出: "202" 示例 2: 输入: -7 输出: "-10" 注意: 输入 ...