iOS 9音頻應用播放音頻之ios9音頻基本功能
在iOS 9音頻應用開發中最為簡單和常用的就是AVFoundation架構中的AVAudioPlayer類。雖然AVAudioPlayer類不能播放網絡上的音頻檔案,但是它可以播放本地音頻檔案,以及緩沖區的檔案。本章将講解最為基礎的音頻播放——本地音頻檔案的播放。
iOS 9音頻應用開發基本功能
實作音頻的播放需要使用到AVAudioPlayer類。AVAudioPlayer是AVFoundation.framework架構裡面最基本的一個音頻播放器的類。使用此類可以實作單個音頻的播放、暫停以及停止等功能。本節将使用AVAudioPlayer類實作一個音頻檔案的播放。
iOS 9中的AVAudioPlayer類簡介
AVAudioPlayer是iOS 2.2之後引入的AVFoundation.framework架構中的一個類,使用此類可以實作音頻的播放。表2-1中總結了AVAudioPlayer類中使用到的方法。
表2-1 AVAudioPlayer類的方法
表2-2總結了了AVAudioPlayer類中使用到的屬性。
表2-2 AVAudioPlayer類的屬性
注意:在Xcode 6.0之後,在建立的項目中,AVFoundation.framework架構預設是被添加到項目中的。如果AVFoundation.framework架構沒有被添加到項目中,就需要開發者手動進行添加。手動添加架構的具體操作步驟如下:
(1)選擇導航視窗中的項目名稱,打開目标視窗,如圖2.1所示。
圖2.1 目标視窗
(2)選擇目标視窗中的Build Phases選項,打開Build Phases面闆,如圖2.2所示。
圖2.2 Build Phases面闆
(3)将Link Binary With Libraries(0 items)打開,會看到一個加号按鈕,如圖2.3所示。
圖2.3 Link Binary With Libraries(0 items)
(4)選擇加号按鈕後,會彈出一個Choose frameworks and libraries to add對話框,如圖2.4所示。
(5)在對話框中找到AVFoundation.framework架構,單擊Add按鈕。此時,就會在Link Binary With Libraries中出現添加的架構,如圖2.5所示。這表明此架構已經添加到了項目中。
圖2.4 Choose frameworks and libraries to add對話框
圖2.5 添加架構
ios9音頻應用開發準備素材檔案
在iOS9的遊戲應用中(如例如超級瑪麗)或者是酷狗音樂打開時,經常會有音頻的播放。這些音頻都是應用程式預置的,也就是素材檔案。在實作播放本地音頻檔案之前,首先需要将預置的音頻檔案添加到建立的項目中。添加音頻檔案的具體操作步驟如下。
(1)在建立項目的導航視窗中右擊,彈出快捷菜單。
(2)在彈出的快捷菜單中選擇Add Files to "***"…指令。彈出選擇檔案對話框,如圖2.6所示。
(3)選擇音頻檔案後,單擊Add按鈕,此時被選擇的音頻檔案就添加到了建立的項目中。
圖2.6 添加音頻檔案
注意:添加音頻檔案到建立的項目中除了以上講解的方式外,還有一種方式,具體的操作步驟如下。
(1)找到需要添加到項目中的音頻檔案,将其拖動到建立的項目中,彈出Choose options for adding these files:對話架構,如圖2.7所示。
圖2.7 添加音頻檔案
(2)單擊Finish按鈕後,音頻檔案就添加到了建立的項目中。
注意:在添加音頻檔案中提到的兩種方式,除了可以添加音頻檔案外,還可以添加其他檔案,如圖像檔案、字型檔案等。
ios9音頻應用開發加載音頻檔案
加載音頻檔案是為了對AVAudioPlayer類進行執行個體化,執行個體化時需要使用到init()方法,根據init()方法參數需求的不同,可以分為4種形式,分别為init(contentsOfURL:)、init(data:)、init(contentsOfURL:fileTypeHint:)和init(data:fileTypeHint:)。以下就是對這四種形式的講解。
1.init(contentsOfURL:)
init(contentsOfURL:)是使用本地音頻檔案的位址對AVAudioPlayer類進行執行個體化。其文法形式如下:
- init(contentsOfURL url: NSURL) throws
其中,參數url是NSURL對象。NSURL是一個資料類型,實際上就是一個位址,很多開發人員會有疑惑,位址就是一個字元串,為什麼還有NSURL類型,那是因為位址分為絕地路徑(描述目标檔案夾的位置)和相對路徑(顯示檔案的完整路徑)。對于絕對路徑來說,位址的字元串都會比較複雜,包括很多請求參數。這樣,在請求過程中需要解析出來每個部分,是以封裝一個NSURL。是以需要将字元串轉換為NSURL,對于NSURL的轉換其實可以使用它的執行個體化方法init來實作,這個方法中會有一個字元串參數,也就是使用字元串去執行個體化NSURL方法,其文法形式如下:
- init(fileURLWithPath path: String)
其中,參數path是一個字元串。此字元串是一個位址(一般來說不同部分之間以斜線(/)分隔),這個位址可以是相對路徑,也可以是絕對路徑。
注意:參數path是隻可以是本地檔案的位址,不可以是網絡位址。
2.init(data:)
在前面的内容中提到AVAudioPlayer類不可以播放從網絡上擷取音頻檔案,但是可以播放從網絡上下載下傳到記憶體緩沖區的音頻。要實作記憶體緩沖區音頻的播放,需要使用init()方法的init(data:)方式,其文法形式如下:
- init(data data: NSData) throws
其中,參數data是一個NSData對象,表示一個音頻資料。由于是要播放記憶體緩沖區的音頻,是以NSData對象在建立時需要指定音頻檔案的位址,此時需要使用到init()方法的init(contentsOfFile:)形式。
- init?(contentsOfFile path: String)
其中,參數path是一個字元串,代碼表示檔案的絕對路徑。
注意:參數data必須是一個完整的檔案。
3.init(contentsOfURL:fileTypeHint:)
方法init(contentsOfURL:)和init(data:)都是在具有字尾名的情況下使用的形式,但是在網絡上下載下傳的音頻檔案可能由于某些原因沒有字尾名。這時就需要使用到init()方法的init(contentsOfURL:fileTypeHint:)形式以及init(data:fileTypeHint:)。init(contentsOfURL:fileTypeHint:)的文法形式如下:
- init(contentsOfURL url: NSURL,
- fileTypeHint utiString: String?) throws
其中,參數url是NSURL對象,此對象的執行個體化在前面講解過。參數utiString用來指定檔案類型的提示,用于提示系統該檔案屬于什麼類型。其中,檔案類型的提示如表2-3所示。
表2-3 檔案類型的提示
4.init(data:fileTypeHint:)
init(data:fileTypeHint:)形式的文法形式如下:
- init(data data: NSData,
- fileTypeHint utiString: String?) throws
其中,參數url是NSURL對象,此對象的執行個體化在前面講解過。參數utiString用來指定檔案類型的提示,這些提示可以參考表2-3。
ios9音頻應用開發添加音頻檔案到緩沖區
對于音頻檔案來說,讀取的次數會過于頻繁,這樣不僅可能導緻存儲卡損耗,還會增加CPU的負擔。為了解決這一問題,我們可以将加載的音頻檔案存入到緩沖區中(緩沖區為暫時放置輸出或輸入資料的地方)。而這一過程需要使用到AVAudioPlayer的prepareToPlay()方法,其文法形式如下
- func prepareToPlay() -> Bool
其中,該方法的傳回值類型為Bool,即布爾類型。當值為真時,表示将檔案放入緩存;反之,則不放入緩存。
ios9音頻應用開發播放音頻
最後一步就是播放音頻,此功能的實作需要使用到AVAudioPlayer的play()方法,其文法形式如下:
- func play() -> Bool
其中,該方法的傳回值類型為Bool即布爾類型。當值為真時,表示音頻檔案播放成功;反之,則失敗。
本文選自:iOS 9音頻應用開發基礎教程大學霸内部資料,轉載請注明出處,尊重技術尊重IT人!