iOS基于Audio Unit的实时音频录制流程

前言

    本文在基于开发项目中的一个语音模块功能所作出的对Audio Unit的使用的简要总结。 在iOS中有很多方法可以进行音视频采集。如 AVCaptureDevice, AudioQueue以及Audio Unit。其中 Audio Unit是最底层的接口,其优点在于功能强大,延迟低; 但弊端在于学习成本高,难度大。

对于iOS的Audio Unit一共三种设置:

1.一个IO Unit(其中remote io unit是iPhone 的三个IO Unit中的一个)的element 1(bus 1)直接与设备上的输入硬件(麦克风)相连;

2.一个IO Unit的element 0(也叫bus 0)直接与设备上的输出硬件(比如扬声器)相连;

3.Remote IO Unit启用了输出而禁止了输入。

对于其设计模式可分为两种:1.录音设计:设置remote io unit的渲染回调,从输入硬件获得采样传入到回调函数进行渲染,从而获得录音数据;2.放音设计:设置remote io unit的输入回调.向回调函数填数据,从而向输出硬件提供数据进行放音。

本文主要是针对iOS接入硬件设备麦克风的音频录制过程进行一个简单的使用流程介绍。

使用流程概要

1.初始化Audio Unit

1).设置上下文描述信息,指定一个特定的音频单元

此代码段仅指定一个音频单元 - Remote I/O unit,所有iOS音频设备都使用componentManufacturer字段的kAudioUnitManufacturer_Apple密钥。

其中componentType和componentSubType的值是根据不同的音频单元来设置:具体可参考Identifier Keys for Audio Units

对于其他设备的描述信息可参照此图进行设置

2).使用音频单元API获取一个音频单元实例

AudioComponentFindNext函数的结果是对定义音频单元的动态链接库的引用,将引用传递给AudioComponentInstanceNew函数以实例化音频单元。

3).创建录制buffer,设置AudioBuffer的基础信息,分配缓冲区

此实例设置的是单声道,若需要设置立体声,将上述Channels设置为2即可。同时为buffer段分配1024byte的缓冲区。

4).设置音频流格式信息

mSampleRate为采样率:即每秒钟采样的次数

帧frame:每一次采样的数据对应一帧

声道数mChannelsPerFrame:人的两个耳朵对统一音源的感受不同带来距离定位,多声道也是为了立体感,每个声道有单独的采样数据,所以多一个声道就多一批的数据。

每一次采样单个声道的数据格式:由mFormatFlags和mBitsPerChannel确定。mBitsPerChannel:数据大小,即采样位深,越大取值范围就更大,不容易数据溢出。mFormatFlags里包含是否有符号、整数或浮点数、大端或是小端等。有符号数就有正负之分,声音也是波,振动有正负之分。这里采用s16格式,即有符号的16比特整数格式。

从层级关系来分析:每秒有SampleRate次采样,每次采样一个frame,每个frame有mChannelsPerFrame个样本,每个样本有mBitsPerChannel这么多数据。

5).设置输入的回调函数

属性kAudioOutputUnitProperty_SetInputCallback指定输入的回调,kInputBus为1,表示element1。

其中输入的回调函数recordingCallbackStruct定义如下:

使用回调函数的目的在于:构建AudioBufferList,使用AudioUnitRender实时获取录制的音频数据。AudioBufferList的内存数据需要我们自己分配,因此需要计算buffer的大小,根据传入的样本数和声道数来计算。

2.开始录制

3.停止录制

其中代码段中利用socket向服务器发送数据的相关信息在此将不再赘述。

以上描述仅用于iOS开发过程中基于Audio Unit音频录制的一个简要的使用流程,同理对于音频播放的使用流程类似。

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

推荐阅读更多精彩内容