天天看點

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

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類的方法

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

表2-2總結了了AVAudioPlayer類中使用到的屬性。 

表2-2  AVAudioPlayer類的屬性

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

注意:在Xcode 6.0之後,在建立的項目中,AVFoundation.framework架構預設是被添加到項目中的。如果AVFoundation.framework架構沒有被添加到項目中,就需要開發者手動進行添加。手動添加架構的具體操作步驟如下:

(1)選擇導航視窗中的項目名稱,打開目标視窗,如圖2.1所示。

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

圖2.1  目标視窗

(2)選擇目标視窗中的Build Phases選項,打開Build Phases面闆,如圖2.2所示。

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

圖2.2  Build Phases面闆

(3)将Link Binary With Libraries(0 items)打開,會看到一個加号按鈕,如圖2.3所示。

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

圖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所示。這表明此架構已經添加到了項目中。

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

圖2.4  Choose frameworks and libraries to add對話框

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

圖2.5  添加架構

ios9音頻應用開發準備素材檔案

在iOS9的遊戲應用中(如例如超級瑪麗)或者是酷狗音樂打開時,經常會有音頻的播放。這些音頻都是應用程式預置的,也就是素材檔案。在實作播放本地音頻檔案之前,首先需要将預置的音頻檔案添加到建立的項目中。添加音頻檔案的具體操作步驟如下。

(1)在建立項目的導航視窗中右擊,彈出快捷菜單。

(2)在彈出的快捷菜單中選擇Add Files to "***"…指令。彈出選擇檔案對話框,如圖2.6所示。

(3)選擇音頻檔案後,單擊Add按鈕,此時被選擇的音頻檔案就添加到了建立的項目中。

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

圖2.6  添加音頻檔案

注意:添加音頻檔案到建立的項目中除了以上講解的方式外,還有一種方式,具體的操作步驟如下。

(1)找到需要添加到項目中的音頻檔案,将其拖動到建立的項目中,彈出Choose options for adding these files:對話架構,如圖2.7所示。

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

圖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  檔案類型的提示

iOS 9音頻應用播放音頻之ios9音頻基本功能iOS 9音頻應用播放音頻之ios9音頻基本功能

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人!

繼續閱讀