在前面的章节部分我们已经对IOS音频结构有了一个清晰的认识,知道Audio Unit是位于整个音频结构的最底层,这一层非常多API已经開始和硬件打交道了。所以比較复杂,有了前面的基础再来看这个部分就比較的easy了。

先来看看Audio Unit的结构图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="435" height="231" alt="">

结构图非常easy了。就不做过多的描写叙述了。

重点说下中间那部分DSP。由于曾经读研的时候学的是DSP嵌入式驱动开发算法移植,所以对这部分比較熟悉。就和大家摆摆龙门阵。DSP全名是digital
signal processing 数字信号处理。

音频信号经过设备採样之后都变成了数字信号。所以採用专门的信号处理芯片来处理效率会非常的高。DSP是个大家族,常见的有TI公司,AD公司。每一个公司下有非常多系列。每一个系列下又有非常多种类。这是一个专门的学科,假设大家有兴趣能够花点时间研究研究,这里就不说了。

以下我们还是来看看从软件层面上怎样使用这个东东:

(1)Audio Unit 初始化參数设置

这里能够设置音频流的各种參数,比方採样频率、量化位数、通道个数、每包中帧的个数等等。

status=AudioUnitSetProperty(audioUnit,
kAudioUnitProperty_StreamFormat,

kAudioUnitScope_Input,

kOutputBus, &audioFormat,
sizeof(audioFormat));

这里是为了设置音频回调方法。我们在这个回调方法中。将全部的须要播放的音频信号一帧帧传递给硬件设备。

status=AudioUnitSetProperty(audioUnit,
kAudioUnitProperty_SetRenderCallback,

kAudioUnitScope_Global,
kOutputBus, &callbackStruct, sizeof(callbackStruct));

这里又多出一个属性设置。我们对Audio Session属性设置,能够设置硬件DSP每次处理音频数据的最小个数。音频处理周期越短。CPU使用越多。可是优点是音频时间间隔较短。用于音视频同步都是很有优点的。

AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration,

sizeof(preferredBufferSize),

&preferredBufferSize)

最后启动Aduio Unit

status=AudioUnitInitialize(audioUnit);

(2)音频数据解析

音频设备我们已经初始化好了。以下我们就来看看怎么吧音频数据拿到。能够分两个部分。ffmpeg部分,以及AudioFile
IOS处理两个方面。

FFmpeg我们会专门拿出几个部分。在IOS架构音视频专栏中具体解说。我们先来看看用AduioFile怎么吧数据拿出来。

事实上使用起来很easy:

result=AudioFileReadPackets(audioFile,
false, &numBytesRead,
NULL, , &packetReads,
audioData);

使用这种方法就能够吧音频数据解析出来。数据都放在audioData中。

(3)回调方法中处理音频数据

在ffmpeg中音频数据装载比較复杂,音频ffmpeg音频处理是以包为单位来进行处理。所以处理的音频数据不一定满足,或者说是大部分情况都不满足DSP对音频数据长度处理的需求。所以这里就要在逻辑上作一定的转换。

具体请參阅专栏中FFmpeg部分。这里看看我们读取本地文件怎样处理的:

static
OSStatus playbackCallback(void *inRefCon,AudioUnitRenderActionFlags *ioActionFlags,

const AudioTimeStamp *inTimeStamp,

UInt32 inBusNumber,

UInt32 inNumberFrames,

AudioBufferList *ioData){

记得我们上面已经把音频数据拿到audioData中。(在读取之前包的大小设定为DSP音频处理数据长度),所以每次取一包数据放到ioData中。

}

另外另一点须要补充,这里硬件处理音频数据的长度必须是2的N次方。为啥呢?由于DSP在处理一些如:FFT、蝶形运算时。必须是以2为基的。(假设不太明确。相见 数字信号处理这本书)。所以我们长见到的数据长度多为512、1024、2048、4096、8192等.

IOS音频架构之Audio Unit的更多相关文章

  1. iOS 实时音频采集与播放Audio Unit使用

    前言 在iOS中有很多方法可以进行音视频采集.如 AVCaptureDevice, AudioQueue以及Audio Unit.其中 Audio Unit是最底层的接口,它的优点是功能强大,延迟低; ...

  2. IOS音频1:之采用四种方式播放音频文件(一)AudioToolbox AVFoundation OpenAL AUDIO QUEUE

    本文转载至 http://blog.csdn.net/u014011807/article/details/40187737 在本卷你可以学到什么? 采用四种方法设计应用于各种场合的音频播放器: 基于 ...

  3. 音频单元组件服务参考(Audio Unit Component Services Reference)

    目录 了解Audio Unit体系结构 文档结构预览 结构单元介绍 本文主要介绍AudioUnit的组成 本文由自己理解而成,如有错误,请欢迎网友们指出校正. 了解Audio Unit体系结构 开始前 ...

  4. Audio Unit 介绍

    关于 Audio Unit iOS 提供了音频处理插件,支持混音,声音均衡,格式转化,以及用于录音,回放,离线渲染,实时对话的输入输出.可以动态载入和使用这些强大而灵活的插件,在 iOS 应用中这些插 ...

  5. iOS音频学习笔记二:iOS SDK中与音频有关的相关框架

      上层:       Media Player Framework: 包含MPMoviePlayerController.MPMoviePlayerViewController.MPMusicPla ...

  6. 一篇对iOS音频比较完善的文章

    转自:http://www.cnblogs.com/iOS-mt/p/4268532.html 感谢作者:梦想通 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也 ...

  7. IOS 整体架构 和 MVC布局

    IOS的生态系统 IOS生态系统不仅仅是指产品,更重要的是指 iPhone/iPad/iPod/Mac +iCloud+App整个系统,包括Siri (部分设备不支持).FaceTime.Safari ...

  8. iOS 系统架构

    https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/iPhoneOSTechOverview/ ...

  9. iOS 操作系统架构

    Mac OS 和 iOS 操作系统架构 做iOS开发已经半年多了,但是感觉对iOS开发的理解却还只停留在表面,昨天刚把两个项目结了,今天打算学了一下iOS系统的架构,以便于更好的理解和开发. 首先看一 ...

随机推荐

  1. StringUtils 的填充方法

    注意:两个参数的用空格填充,三个参数的用后面的参数填充 第一个参数要填充的字符串,第二个是需要的长度,第三个是以什么填充. 左侧填充: leftPad(): StringUtils.leftPad(S ...

  2. React入门基础

    1-react概念: React是一个用于构建用户界面的JavaScript库.React主要用于构建UI,很多人认为React是MVC中的V(视图).React起源于Facebook的内部项目.Re ...

  3. 移动端ios兼容问题

    IOS系统bug: 1)input无法输入的问题: -webkit-user-select:none;改成-webkit-user-select:auto: 2)滚动不流畅(overflow-y:au ...

  4. Hadoop学习;測试;启动bug;secondary合并edits到fsimage

    一个Hadoop集群拥有多个并行的计算机.用以存储和处理大规模的数据集 Hadoop强调代码向数据迁移 要执行的程序在规模上比数据小的多,更easy移动,此外通过网络移动数据比载入执行程序更花时间,这 ...

  5. 【Oracle学习笔记】

    内容主要包括: (1)三种循环及其简化 (2)游标的使用 (3)异常处理 (4)存储过程 (5)存储函数 (6)触发器 (7)其它pl/sql操作 ---------------loop循环定义变量- ...

  6. Cocos2d-x 常见宏

    1)NS_CC_BEGIN cocos2d命名空间開始 2) NS_CC_END  cocos2d命名空间结束 3)USING_NS_CC 声明cocos2d命名空间 4)CC_SYNTHESIZE_ ...

  7. pandaboard安装ubuntu

    参照:https://wiki.ubuntu.com/ARM/OmapDesktopInstall 主要是在linux下安装,主要命令为: zcat ./ubuntu-12.04-preinstall ...

  8. nyoj--61--传纸条(一)(动态规划)

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列 ...

  9. COGS 2479 奇怪的姿势卡♂过去 (bitset+折半)

    思路: 此题显然是CDQ套CDQ套树套树 (然而我懒) 想用一种奇怪的姿势卡过去 就出现了以下解法 5w*5w/8的bitset hiahiahia 但是空间会爆怎么办啊- 折半~ 变成5w*2.5w ...

  10. java的可查的异常和不可查的异常讲解

    java的可查的异常和不可查的异常讲解: Java的异常(包括Exception和Error)分为:可查的异常(checked exceptions)和不可查的异常(unchecked excepti ...