AVFoundation連續(xù)系列之三音頻引擎
在咱們開發(fā)的時候 經(jīng)常會遇到需要給咱們的聲音添加音效,甚至是實時添加音效,這就用到了咱們這季所講的內(nèi)容
咱們這季講AVAudioEngine相關(guān)的一系列音頻處理
在咱們處理音頻的時候,咱們需要了解一下處理音頻的一個流程,如下圖:

咱們處理的一個流程是 音頻輸入(Mic、音頻)->連到效果器->效果器連到輸出口(音響)。
在進行這一系列操作的時候,咱們需要使用一個統(tǒng)一的管理者,就是咱們的音頻引擎->AVAudioEngine,還需要使用到咱們一個非常常用的元素叫做音頻節(jié)點->AVAudioNode,所有的節(jié)點都必須附著到咱們的音頻引擎,音頻引擎按照順序連接每一個節(jié)點,從輸入到輸出。
咱們先看下咱們非常重要的音頻節(jié)點,音頻節(jié)點又劃分了幾類,如下圖:

咱們大概了解了一下關(guān)于AVAudioEngine執(zhí)行的步驟和相關(guān)概況,咱們詳細的去講解下每一個部分。
AVAudioEngine 音頻引擎
咱們的音頻引擎是2014年iOS8發(fā)布的時候 一起公布的產(chǎn)物,所以他只支持iOS8以上,老習(xí)慣,先去看下他所有的API。
1.初始化:init()
2.附著節(jié)點的方法:funcattachNode(node:AVAudioNode)
3.分離節(jié)點:funcdetachNode(node:AVAudioNode)
4.連接節(jié)點的方法:
funcconnect(node1:AVAudioNode, to node2:AVAudioNode, fromBus bus1:AVAudioNodeBus, toBus bus2:AVAudioNodeBus, format:AVAudioFormat?)
funcconnect(node1:AVAudioNode, to node2:AVAudioNode, format:AVAudioFormat?)
funcconnect(sourceNode:AVAudioNode, toConnectionPoints destNodes: [AVAudioConnectionPoint], fromBus sourceBus:AVAudioNodeBus, format:AVAudioFormat?)
5.斷開節(jié)點的方法:
funcdisconnectNodeInput(node:AVAudioNode, bus:AVAudioNodeBus)
funcdisconnectNodeInput(node:AVAudioNode)
funcdisconnectNodeOutput(node:AVAudioNode, bus:AVAudioNodeBus)
funcdisconnectNodeOutput(node:AVAudioNode)
6.暫停:funcprepare()
7.開始:funcstart()throws
8.暫停:funcpause()
9.重置所有節(jié)點:funcreset()
10.停止:funcstop()
11.獲得總線上某個節(jié)點的信息:
funcinputConnectionPointForNode(node:AVAudioNode, inputBus bus:AVAudioNodeBus) ->AVAudioConnectionPoint?
funcoutputConnectionPointsForNode(node:AVAudioNode, outputBus bus:AVAudioNodeBus) -> [AVAudioConnectionPoint]
12.設(shè)置音樂序列:musicSequence
13.獲得音頻引擎的輸出節(jié)點:varoutputNode:AVAudioOutputNode{ get }
14.獲得音頻引擎的輸入節(jié)點:varinputNode:AVAudioInputNode? { get }
15.獲得混和節(jié)點:varmainMixerNode:AVAudioMixerNode{ get }
16.獲得音頻引擎是否正在運行:varrunning:Bool{ get }
17.當(dāng)音頻引擎的配置發(fā)生改變的時候 會向使用的地方發(fā)送一個通知,這個通知的名字叫做:letAVAudioEngineConfigurationChangeNotification:String
這是所有關(guān)于音頻引擎的介紹。
好啦!咱們介紹了半天,也該開始code了。
咱們先使用AVAudioEngine去錄制音頻流
//創(chuàng)建音頻引擎
lazyvarengine =AVAudioEngine()
overridefuncviewDidLoad() {
super.viewDidLoad()
//獲得輸入端口
letinput =engine.inputNode!
//連接輸入輸出設(shè)置格式
engine.connect(input, to:engine.outputNode, format: input.inputFormatForBus(0))
//用于創(chuàng)建record/monitor/observe的輸出端口
input.installTapOnBus(0, bufferSize:8192, format: input.inputFormatForBus(0)) { (AVAudioPCMBuffer, AVAudioTime)in
print("XXXXX")
print(AVAudioPCMBuffer,AVAudioTime)
}
//開啟引擎
try!engine.start()
有人就會說了,我這使用AudioQueue也是可以實現(xiàn)的,不錯!那咱們繼續(xù)!
如何去實現(xiàn)實時錄制播放的功能呢?
代碼如下:
lazyvarengine =AVAudioEngine()
overridefuncviewDidLoad() {
super.viewDidLoad()
letinput =engine.inputNode!
letoutput =engine.outputNode
engine.connect(input, to: output, format: input.inputFormatForBus(0))
try!engine.start()
}
簡單的幾句代碼搞定!
這節(jié)課呢 咱們就先玩到這!有意思的還在后面!
相關(guān)代碼:
示例1:https://github.com/liuyujing/AudioEffect-NO.1.git
示例2:https://github.com/liuyujing/AudioEffect-NO.1-2.git