AVFoundation連續(xù)系列之三音頻引擎

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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • AVFoundation連續(xù)系列之四添加音效 這一部分我覺得是咱們這一系列中比較有意思的地方,如果你再懂一些音樂,...
    劉玉靜閱讀 4,916評論 3 25
  • AVFoundation連續(xù)系列之五為音樂文件添加音效 咱們再次回顧下咱們的AVAudioNode,它是咱們AVA...
    劉玉靜閱讀 4,269評論 8 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • 要先了解iOS 音頻API具體有哪一些,看這篇文章。Audio API Overviewhttps://www.o...
    康雙全閱讀 19,788評論 18 39
  • 今年主要要做的兩件事是 順利畢業(yè) 順利拿到畢業(yè)設(shè)計的學(xué)分,然后畢業(yè)。不要出現(xiàn)想去年漏選學(xué)分的情況。 好好工作1 學(xué)...
    Dingo_閱讀 259評論 0 0

友情鏈接更多精彩內(nèi)容