在iOS 9音頻應用開發中最爲簡單和經常使用的就是AVFoundation框架中的AVAudioPlayer類。雖然AVAudioPlayer類不能播放網絡上的音頻文件,可是它能夠播放本地音頻文件,以及緩衝區的文件。本章將講解最爲基礎的音頻播放——本地音頻文件的播放。ios
實現音頻的播放須要使用到AVAudioPlayer類。AVAudioPlayer是AVFoundation.framework框架裏面最基本的一個音頻播放器的類。使用此類能夠實現單個音頻的播放、暫停以及中止等功能。本節將使用AVAudioPlayer類實現一個音頻文件的播放。緩存
AVAudioPlayer是iOS 2.2以後引入的AVFoundation.framework框架中的一個類,使用此類能夠實現音頻的播放。表2-1中總結了AVAudioPlayer類中使用到的方法。網絡
表2-1 AVAudioPlayer類的方法框架
表2-2總結了了AVAudioPlayer類中使用到的屬性。
字體
表2-2 AVAudioPlayer類的屬性ui
注意:在Xcode 6.0以後,在建立的項目中,AVFoundation.framework框架默認是被添加到項目中的。若是AVFoundation.framework框架沒有被添加到項目中,就須要開發者手動進行添加。手動添加框架的具體操做步驟以下:url
(1)選擇導航窗口中的項目名稱,打開目標窗口,如圖2.1所示。spa
圖2.1 目標窗口code
(2)選擇目標窗口中的Build Phases選項,打開Build Phases面板,如圖2.2所示。orm
圖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的遊戲應用中(如例如超級瑪麗)或者是酷狗音樂打開時,常常會有音頻的播放。這些音頻都是應用程序預置的,也就是素材文件。在實現播放本地音頻文件以前,首先須要將預置的音頻文件添加到建立的項目中。添加音頻文件的具體操做步驟以下。
(1)在建立項目的導航窗口中右擊,彈出快捷菜單。
(2)在彈出的快捷菜單中選擇Add Files to "***"…命令。彈出選擇文件對話框,如圖2.6所示。
(3)選擇音頻文件後,單擊Add按鈕,此時被選擇的音頻文件就添加到了建立的項目中。
圖2.6 添加音頻文件
注意:添加音頻文件到建立的項目中除了以上講解的方式外,還有一種方式,具體的操做步驟以下。
(1)找到須要添加到項目中的音頻文件,將其拖動到建立的項目中,彈出Choose options for adding these files:對話框架,如圖2.7所示。
圖2.7 添加音頻文件
(2)單擊Finish按鈕後,音頻文件就添加到了建立的項目中。
注意:在添加音頻文件中提到的兩種方式,除了能夠添加音頻文件外,還能夠添加其餘文件,如圖像文件、字體文件等。
加載音頻文件是爲了對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。
對於音頻文件來講,讀取的次數會過於頻繁,這樣不只可能致使存儲卡損耗,還會增長CPU的負擔。爲了解決這一問題,咱們能夠將加載的音頻文件存入到緩衝區中(緩衝區爲暫時放置輸出或輸入數據的地方)。而這一過程須要使用到AVAudioPlayer的prepareToPlay()方法,其語法形式以下
func prepareToPlay() -> Bool
其中,該方法的返回值類型爲Bool,即布爾類型。當值爲真時,表示將文件放入緩存;反之,則不放入緩存。
最後一步就是播放音頻,此功能的實現須要使用到AVAudioPlayer的play()方法,其語法形式以下:
func play() -> Bool
其中,該方法的返回值類型爲Bool即布爾類型。當值爲真時,表示音頻文件播放成功;反之,則失敗。
本文選自:iOS 9音頻應用開發基礎教程大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!