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

大學霸發表於2015-11-13

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

iOS 9音訊應用開發中最為簡單和常用的就是AVFoundation框架中的AVAudioPlayer類。雖然AVAudioPlayer類不能播放網路上的音訊檔案,但是它可以播放本地音訊檔案,以及緩衝區的檔案。本章將講解最為基礎的音訊播放——本地音訊檔案的播放。

iOS 9音訊應用開發基本功能

實現音訊的播放需要使用到AVAudioPlayer類。AVAudioPlayerAVFoundation.framework框架裡面最基本的一個音訊播放器的類。使用此類可以實現單個音訊的播放、暫停以及停止等功能。本節將使用AVAudioPlayer類實現一個音訊檔案的播放。

iOS 9中的AVAudioPlayer類簡介

AVAudioPlayeriOS 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


其中,引數urlNSURL物件。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


其中,引數urlNSURL物件,此物件的例項化在前面講解過。引數utiString用來指定檔案型別的提示,用於提示系統該檔案屬於什麼型別。其中,檔案型別的提示如表2-3所示。

2-3  檔案型別的提示


4.init(data:fileTypeHint:)

init(data:fileTypeHint:)形式的語法形式如下:


  • init(data data: NSData,
  • fileTypeHint utiString: String?) throws


其中,引數urlNSURL物件,此物件的例項化在前面講解過。引數utiString用來指定檔案型別的提示,這些提示可以參考表2-3

ios9音訊應用開發新增音訊檔案到緩衝區

對於音訊檔案來說,讀取的次數會過於頻繁,這樣不僅可能導致儲存卡損耗,還會增加CPU的負擔。為了解決這一問題,我們可以將載入的音訊檔案存入到緩衝區中(緩衝區為暫時放置輸出或輸入資料的地方)。而這一過程需要使用到AVAudioPlayerprepareToPlay()方法,其語法形式如下


  • func prepareToPlay() -> Bool


其中,該方法的返回值型別為Bool,即布林型別。當值為真時,表示將檔案放入快取;反之,則不放入快取。

ios9音訊應用開發播放音訊

最後一步就是播放音訊,此功能的實現需要使用到AVAudioPlayerplay()方法,其語法形式如下:


  • func play() -> Bool


其中,該方法的返回值型別為Bool即布林型別。當值為真時,表示音訊檔案播放成功;反之,則失敗。

本文選自:iOS 9音訊應用開發基礎教程大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29597077/viewspace-1836148/,如需轉載,請註明出處,否則將追究法律責任。

相關文章