关于音频播放的那点儿事儿(一) 初探iOS音频 CoreAudio Essentials

CoreAudio的编程接口分为3层,如下图所示


来源于苹果文档

Low-Level Services包含:

1.I/O Kit:驱动

2.AudioHAL:音频硬件抽象层,为硬件提供一个设备独立、驱动独立的接口

3.Core MIDI:提供服务于MIDI流和设备的软件抽象

4.Host Time Services:提供访问计算机时钟

Mac apps 可以被创建成直接应用这些技术,当它们需要尽可能实时的性能。然而,很多音频程序并不能访问这些层级。事实上,在iOS中核心音频为实现实时音频运用更高层级接口提供方法。OpenAL, 举个例子,在游戏中为实时音频使用I/O,但是实际是确实一个小得多,转换API适当的设置移动设备。

在核心音频中Middle-Level Layer,包括数据格式转换、硬盘的读写,解析刘文建,还要插件的使用。

1.Audio Converter Services:让应用程序处理音频数据格式转换。

2.Audio File Services:读写基于硬盘的音频数据。可以解析采样频率、码率、时长等信息,分离音频文件的音频帧

3.Audio Unit Services(播放音频数据) 和 Audio Processing Graph Services(音效处理模块):让应用程序处理DSP(数字信号处理)插件,像均衡器和混音器。

4.Audio File Stream Services:让你创建的应用程序可以解析音频流文件,就像通过网络连接播放流文件。

5.Core Audio Clock Services:支持音频和MIDI同步以及基于时间的转换。

6.Audio Format Services(一个小的API, 在图中并没有展示),协助管理应用程序中的音频数据格式。

在iOS中核心音频提供这些服务的一大部分:在核心音频 High-level Services包括结合了较低层特点的更直接的接口。

1.Audio Queue Services提供你记录、播放、暂停、循环和同步音频。它使用必要的编解码器去压缩音频格式。

2.AVAudioPlayer:为播放音频和循环提供了一个简单的OC接口,以及实现快进和快退。高级接口,可以完成整个音频播放过程,但是不能实现混音器和均衡器功能。

3.Extended Audio File Services:结合了Audio File Services和 Aduio Converter Services的特点。它给你提供了一个用于读写未压缩和压缩声音文件。

4.OpenAL是定位音频的开源OpenAL标准的核心音频的实现。它是建立在系统提供的3D混音器音频单元的顶部。所有的应用程序都可以使用OpenAL,尽管它最合适用于游戏开发。

音频一般播放的流程:

1.读取音频文件

2.解析采样频率、码率、时长等信息,分离音频文件的音频帧。    

        Audio File Service 读写音频数据,Audio File Stream Services:对音频进行解码

3.对分离出来的音频真解码得到PCM数据 

        Audio Converter services:音频数据转换
4.对PCM数据进行音效处理(均衡器、混音器,非必须的) 

         Audio Process Graph Services:音效处理模块

5.把PCM数据解码成音频信号6.把音频信号交给硬件播放 

         Aduio Unit Services:播放音频数据

7.重复1-6步 

Framework

直到播放完成如上就是音频核心API三个层级以及各个层级内容的功能关于Framework这里只关注与iOS有关系的.

AudioToolbox.framework :Audio Session Services:作为管理你应用程序在手机和iPod设备中的音频行为。

AudioUnit.framework:Audio Unit Services

AVFoundation.framework:提供AVAudioPlayer class

CoreAudio.framework:提供跨核心音频以及底层服务接口的数据类型。
OpenAL.framework:OpenAL
 iOS不支持的有:CoreAudioKit.framework   CoreMIDI.frame    CoreMIDIServer.framework

 附录CoreAudio framework 描述了所有这些框架,以及他们包含的头文件。

Proxy Objects:

核心音频运用代理对象的概念来表示注入文件、流、音频播放器等等。当你希望你的应用程序使用磁盘上的音频文件,举个例子,第一步是将音频文件对象实例化为AudioFileID类型。这个对象在AudioFile.h顶部被声明为一个不透明的数据结构。

typedef struct OpaqueAudioFileID *AudioFileID;

你实例化一个音频文件对象,并且创建一个实际的音频文件绑定到一个调用AduioFileCreateWithURL函数的对象。该函数给你一个新的音频文件对象的引用。从那时起,你才通过代理使用真正的音频文件。

这种机制贯穿整个核心音频,无论是你播放音频文件、iPhone audio sessions 更甚者是硬件设备。

Properties, Scopes, and Elements

大部分核心音频接口运用属性机制来管理对象状态和精简对象行为。属性就是键值对。

属性key值是特殊的枚举变量缩写,诸如kAudioFileProperyFileFormar或者kAudioQueueDevicePropery_NumberChannels.

属性value值是一个特定的数据类型,合适的目标属性-void、Float64、 AudioChannelLayout结构等等。

这里有很多苹果定义的属性。你将会在Core Audio framework的头文件中找到他们的定义。有些核心音频的接口,如Audio Unit Services, 也让你自己定义自己的属性。

核心音频接口运用存储器函数取回一个对象的属性值,如果是一个可写的属性,修改它的值。你也会找到一个第三方的存储器来获取属性的信息。例如,Audio Unit Services的AudioUnitGetProperyInfo告诉你一个给定的属性值的数据类型大小以及是否可以修改它。Audio Queue Services的AudioQueueGetPropertySize获取指定属性值得大小。

核心音频接口提供一个通知你app属性值是否改变的机制。你可以在Callback Functions:Interacting with Core Audio中读到。

在某些情况下,属性应用于作为整体的音频对象。例如,在回放的音频队列中计算音频level(啥意思。。level???),你可以设置他的kAudioQueueProperty_EnableLabelMetering 的属性为true.

其他核心音频对象有内部的结构,每一个都有他们特殊的的属性设置。例如,一个音频单元有输入、输出和全局范围。一个音频单元的输入或者输出都由一个或者多个属性组成,每一个元素类似于音频硬件中的信道总线。当你用kAudioUnitPropery_AudioChannelLayout属性调用AudioUnitGetPropery函数,你不仅指定你想要的音频单元信息而且是范围和元素。

参考:iOS音频播放 (一):概述

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容