AVAudioEngine完成即时录音与播放功能

AVAudioEngine完成即时录音与播放功能

来源:502 AVAudioEngine in Practice

这次WWDC 2014上推出在iOS8上才有的AVAudioEngine,它将以往AUGraph实作上很烦杂的设定简化,所以使用上可能对于AUGraph及Remote IO操作要有点了解操作上更得心应手,相关知识参考Audio Processing Graph(AUGraph)完成即时录音与播放功能。接下来请务必将Xcode升级至6.0以上版本才能使用AVAudioEngine功能。

加入AVFoundation Framework

首先建立Project后确认AVFoundation Framework是否加入:

未加入请参考下面的图示加入:

+新增framework,

输入关键字AVFoundation

选择Framework并加入

宣告AVAudioEngine

AVAudioEngine 功能非常多,此篇要实作出即时录音与播放功能为原则将程式写出来,与先前的文章Audio Processing Graph(AUGraph)完成即时录音与播放功能比较差异,看看AVAudioEngine简化过程有多少?

首先记得先引入标头档:

//-----------start-----------
#import <AVFoundation/AVFoundation.h>
//------------end------------

接下来宣告AVAudioEngine

//-----------start-----------
    AVAudioEngine *engine = [[AVAudioEngine alloc] init];
//------------end------------

上面程式完成宣告及初始化动作,往后整个过程都依靠AVAudioEngine提供的方法来完成。(它太强大了)

取得输入节点

AVAudioEngine将每个装置都化成一个节点,节点除了硬体的麦克风、喇叭之外,还有提供软体的装置,如:Delay、Mixer…等,所以取得输入装置执行方法inputNode就能取得:

//-----------start-----------
    AVAudioEngine *engine = [[AVAudioEngine alloc] init];
    AVAudioInputNode *input = [engine inputNode];
//------------end------------

连接节点

AVAudioEngine提供方法connect,让我们像接音响的方式将许多节点串接起来产生效果,示意图如下:

图中需要另外介绍的方法是mainMixerNode,这是一个允许多输入及单一输出接口的节点,本身初始化时AVAudioEngine已经将mainMixerNode与输出端连接,所以我们要将输入节点与它连接后就能完成即时录音与播放功能,接续之前的程式后增加输入节点与mainMixerNode的连接,

//-----------start-----------
    AVAudioEngine *engine = [[AVAudioEngine alloc] init];
    AVAudioInputNode *input = [engine inputNode];
    [engine connect:input to:[engine mainMixerNode] format:[input inputFormatForBus:0]];
//------------end------------

上面程式中的format为输入音讯格式,这里使用的是以输入装置格式为主,如此一来输入、输出格式就能统一,接下来执行启动方法后就能正常的听到麦克风声音完整的从喇叭播放。

启动、停止

前面程式将相关准备都准备完成,接下来只需要启动AVAudioEngine让它开始工作:

//-----------start-----------
    AVAudioEngine *engine = [[AVAudioEngine alloc] init];
    AVAudioInputNode *input = [engine inputNode];
    [engine connect:input to:[engine mainMixerNode] format:[input inputFormatForBus:0]];
    NSError *error;
    [engine startAndReturnError:&error];
//------------end------------

没错,短短的这几行程式就能取代先那篇文章Audio Processing Graph(AUGraph)完成即时录音与播放功能的功能,是不是非常方便?

启动后要将AVAudioEngine停止需要执行它的停止方法:

//-----------start-----------
[engine stop]
//------------end------------

此篇很简略的完成功能,往后有其他深入的相关心得再另外介绍,AVAudioEngine只是AVFoundation framework新增的其中一个功能,可以参考官网提供的AV Foundation Framework Reference更清楚了解新增加与旧有的功能。

参考资料

AV Foundation Framework Reference

502 AVAudioEngine in Practice