iOS AvPlayer AvAudioPlayer音訊後台播放問題

來源:互聯網
上載者:User

標籤:

iOS 4開始引入的multitask,我們可以實現像ipod程式那樣在背景播放音頻了。如果音頻操作是用蘋果官方的AVFoundation.framework實現,像用AvAudioPlayer,AvPlayer播放的話,要實現完美的後台音頻播放,依據app的功能需要,可能需要實現幾個關鍵的功能。

首先,播放音頻之前先要設定AVAudioSession模式,通常只用來播放的App可以設為AVAudioSessionCategoryPlayback即可。模式意義及其他模式請參考文檔。

 

[plain] view plaincopyprint? 
  1. AVAudioSession *session = [AVAudioSession sharedInstance];  
  2. [session setCategory:AVAudioSessionCategoryPlayback error:nil];  
  3. [session setActive:YES error:nil];  

 

1。通知OS該app支援background audio。預設情況下,當按下home鍵時,當前正在啟動並執行程式被suspend,狀態從active變成in-active,也就是說如果現正播放音頻,按下HOME後就會停止。這裡需要讓app在按在HOME後,轉到後台運行而非被suspend,解決辦法是在程式的-info.plist中增加required background modes這個key項,並選擇App plays audio這個value項。

 

2。現在按下HOME鍵後,程式退到後台,但是聲音仍在播放。但是如果要實現播放清單的依次播放、迴圈播放,即放完一首後自動切換到下一首,問題來了,當App在後台放完一首後,就會停下來。原因是在後台運行時,一旦聲音停下來,程式也隨之suspend,因此在切換檔案載入的間隙,程式就會被suspend。曾經有山寨的解決辦法是專門起一個player的執行個體連續不停的放同一無聲音片斷,阻止程式被suspend。這裡提供的方法是通過申請後台taskID達到後台切換播放檔案的功能。

 

即聲明後台task id,並通過beginBackgroundTaskWithExpirationHandler將App設為後台Task,達到持續後台啟動並執行目的。我們知道一般情況下,按HOME將程式送到後台,可以有5或10秒時間可以進行一些收尾工作,具體時間[[UIApplication sharedApplication] backgroundTimeRemaining]傳回值。逾時後app會被suspend,現在要做的就是用[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]開始背景工作,可以將後台運行逾時時間長時間的延長,具體延長多少時間還是見傳回值,總之對於放段時間音樂應該夠了。另一個問題是每個開始的背景工作,都必須用endBackgroundTask來結束。 因此,在每次開始播放後啟動新的背景工作,同時結束上一個背景工作:

首先,要在viewdidload中

 

[plain] view plaincopyprint?
  1. [UIApplication sharedApplication] beginReceivingRemoteControlEvents];  
否則,無法切換到下一首,接下來

 

 

[plain] view plaincopyprint?
  1. UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;  
  2.       
  3. [avPlayer play];  
  4. newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];  
  5. if (newTaskId != UIBackgroundTaskInvalid && oldTaskId != UIBackgroundTaskInvalid) {  
  6.      [[UIApplication sharedApplication] endBackgroundTask: oldTaskId];}   
  7. oldTaskId = newTaskId;  

當然,還有更方便的辦法就是在resignActive時beginBackgroundTaskWithExpirationHandler:並在BecomeActive中endBackgroundTask: 

 

3。我們知道,ipod播放程式在後台時,雙擊HOME鍵,會有個控制介面,可以對它進行播放控制。

 

如果您想讓您的app可以像ipod一樣在後台也可以方便的通過雙擊HOME鍵來控制,就要用到遠端控制事件了。

首先在viewdidload等初始化的地方聲明App接收遠端控制事件,並在相應地方結束聲明

 

[plain] view plaincopyprint? 
  1. - (void) viewWillAppear:(BOOL)animated  
  2. {  
  3. [super viewWillAppear:animated];  
  4. [UIApplication sharedApplication] beginReceivingRemoteControlEvents];  
  5. [self becomeFirstResponder];  
  6. }  
  7.   
  8. - (void) viewWillDisappear:(BOOL)animated  
  9. {  
  10. [super viewWillDisappear:animated];  
  11. [UIApplication sharedApplication] endReceivingRemoteControlEvents];  
  12. [self resignFirstResponder];  
  13. }  

定義

 

 

[plain] view plaincopyprint?
  1. - (BOOL)canBecomeFirstResponder  
  2. {  
  3.        return YES;  
  4. }  

最後定義 remoteControlReceivedWithEvent,處理具體的播放、暫停、前進、後退等具體事件

 

 

[plain] view plaincopyprint?
  1. - (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {      
  2.     if (receivedEvent.type == UIEventTypeRemoteControl) {  
  3.   
  4.         switch (receivedEvent.subtype) {  
  5.   
  6.             case UIEventSubtypeRemoteControlTogglePlayPause:  
  7.                 [self playButtonPressed:playButton];  
  8.                 [self testing];  
  9.                 break;  
  10.   
  11.             case UIEventSubtypeRemoteControlPreviousTrack:  
  12.                 [self rewButtonReleased:(UIButton *)rewButton];  
  13.                 break;  
  14.   
  15.             case UIEventSubtypeRemoteControlNextTrack:  
  16.                 [self ffwButtonReleased:(UIButton *)ffwButton];  
  17.                 break;  
  18.   
  19.             default:  
  20.                 break;  
  21.         }  
  22.     }  
  23. }  

 

4. 至此,您有播放App已經相當完美了,還有最後一個問題,那就是當使用者使用耳機時,問題又來了。系統預設當插入耳機時,現正播放的聲音不中斷,直接切換到耳機播放,而當拔出耳機時,播放停止。如果這種行為滿足您的要求,那OK,否則您就需要進一步研究耳機檢測和聲音路由切換的問題。

iOS AvPlayer AvAudioPlayer音訊後台播放問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.