iPhone OS 主要提供如下了幾種播放音頻的方法:html
1. System Sound Services網絡
System Sound Services 是最底層也是最簡單的聲音播放服務,調用 AudioServicesPlaySystemSound 這個方法就能夠播放一些簡單的音頻文件,使用此方法只適合播放一些很小的提示或者警告音,由於它有不少限制:app
■ 聲音長度要小於 30 秒
■ In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的
■ 打包成 .caf, .aif, 或者 .wav 的文件
■ 不能控制播放的進度
■ 調用方法後當即播放聲音
■ 沒有循環播放和立體聲控制less
另外,它還能夠調用系統的震動功能,方法也很簡單。具體的代碼能夠參考官方的示例 SysSound
,可是官方的示例只有一些簡單的用法,從文檔中咱們發現能夠經過 AudioServicesAddSystemSoundCompletion 方法爲音頻播放添加 CallBack 函數,有了 CallBack 函數咱們能夠解決很多問題,好比能夠克服 System Sound Services 自己不支持循環播放的問題。iphone
2. AVAudioPlayer 類
AVAudioPlayer 是 AVFoundation.framework 中定義的一個類,因此使用要先在工程中引入 AVFoundation.framework。咱們能夠把 AVAudioPlayer 看做是一個高級的播放器,它支持普遍的音頻格式,主要是如下這些格式:ide
■ AAC
■ AMR(AdaptiveMulti-Rate, aformatforspeech)
■ ALAC(AppleLossless)
■ iLBC(internetLowBitrateCodec, anotherformatforspeech)
■ IMA4(IMA/ADPCM)
■ linearPCM(uncompressed)
■ µ-lawanda-law
■ MP3(MPEG-1audiolayer3函數
AVAudioPlayer 能夠播聽任意長度的音頻文件、支持循環播放、能夠同步播放多個音頻文件、控制播放進度以及從音頻文件的任意一點開始播放等,更高級的功能能夠參考 AVAudioPlayer 的文檔 。要使用 AVAudioPlayer 的對象播放文件,你只需爲其指定一個音頻文件並設定一個實現了 AVAudioPlayerDelegate 協議的 delegate 對象。oop
只要將 AVAudioPlayer 的 numberOfLoops 屬性設爲負數,音頻文件就會一直循環播放直到調用 stop 方法。優化
AVAudioPlayer 一樣支持 Callback,這是 AVAudioPlayerDelegate 的一個可選 delegate 方法:ui
- (void ) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL ) flag { if (player == self .player && flag == YES) { NSLog(@"Playback finish." ); } }
另外,你能夠隨時控制 AVAudioPlayer 對象的播放、暫停以及中止,經過判斷對象的狀態,分別調用 play、pause 和 stop 方法便可:
- (IBAction) playOrPause: (id ) sender { // if playing, pause if (self .player.playing) { [self .player pause]; // if stopped or paused, start playing } else { [self .player play]; }
雖然 AVAudioPlayer 能夠播放不少格式,可是咱們在實際開發過程當中仍是最好使用一些沒有壓縮的格式,好比 WAVE 文件,這樣能夠減小系統處理單元的資源佔用,以便更好的完成程序的其餘功能。另外,在使用 AVAudioPlayer 連續播放 mp3 這類通過壓縮的音頻文件時,在鏈接處可能出現必定的間隔時間。
3. Audio Queue Services
若是以上兩種音頻播放的解決方案都沒法知足你的需求,那麼我想你確定須要使用 Audio Queue Services。使用 Audio Queue Services 對音頻進行播放,你能夠徹底實現對聲音的控制。例如,你能夠在聲音數據從文件讀到內存緩衝區後對聲音進行必定處理再進行播放,從而實現對音頻的快速/慢速 播放的功能。
由於 Audio Queue Services 相對複雜不少,Apple 官方已經把它整理爲一本書了,具體能夠參考 Audio Queue Services Programming Guide 和 SpeakHere 的程序示例。
4. OpenAL
OpenAL 是一套跨平臺的開源的音頻處理接口,與圖形處理的 OpenGL 相似,它爲音頻播放提供了一套更加優化的方案。它最適合開發遊戲的音效,用法也與其餘平臺下相同。
本篇主要講AVAudioPlayer,
AVAudioPlayer類封裝了播放單個聲音的能力。播放器能夠用NSURL或者NSData來初始化,要注意的是NSURL不能夠是網絡url而必須是本地文件url,由於AVAudioPlayer不具有播放網絡音頻的能力。
一個AVAudioPlayer只能播放一個音頻,若是你想混音你能夠建立多個AVAudioPlayer實例,每一個至關於混音板上的一個軌道。
1、建立一個播放器
AVAudioPlayer *player = [[AVAudioPlayeralloc] initWithContentsOfURL:[NSURLfileURLWithPath:[[NSBundlemainBundle] pathForResource:@"星月神話" ofType:@"mp3"]] error:nil];//使用本地URL建立 AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:Data error:nil];//使用NSData建立
2、播放器屬性
建立一個AVAudioPlayer之後你就能夠對它的各類屬性進行訪問或設置了。
一、音量
player.volume =0.8;//0.0-1.0之間
二、循環次數player.numberOfLoops =3;//默認只播放一次
三、播放位置player.currentTime =15.0;//能夠指定從任意位置開始播放
四、聲道數
NSUInteger channels = player.numberOfChannels;//只讀屬性
五、持續時間
NSTimeInterval duration = player.duration;//獲取持續時間
六、儀表計數
player.meteringEnabled =YES;//開啓儀表計數功能
[playerupdateMeters];//更新儀表計數
3、播放聲音[player prepareToPlay];//分配播放所需的資源,並將其加入內部播放隊列
[playerplay];//播放
[playerstop];//中止
4、代理方法
這個類對應的AVAudioPlayerDelegater的委託方法。 audioPlayerDidFinishPlaying:successfully: 當音頻播放完成以後觸發。當播放完成以後,能夠將播放按鈕的文本從新回設置成:Play Audio File
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { //播放結束時執行的動做 [audioButton setTitle:@"Play Audio File" forState:UIControlStateNormal]; }
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error; { //解碼錯誤執行的動做 }
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player; { //處理中斷的代碼 } audioPlayerEndInterruption:,當程序被應用外部打斷以後,從新回到應用程序的時候觸發。在這裏當回到此應用程序的時候,繼續播放音樂。 - (void)audioPlayerEndInterruption:(AVAudioPlayer *)player { [audioPlayer play]; }