iOS 視頻中斷後臺音樂播放處理方案

問題(App Store 用戶評論反饋):

  1. 後臺音樂播放器播放時啓動App音樂播放器暫停,只能手動恢復
  2. 手機靜音模式下視頻播放沒有聲音

解決方案:

在播放音頻時讓其餘程序靜音,或者在其餘程序的音頻之上播放音頻。bash

AVAudioSession 類由 AVFoundation 框架引入。每一個 iOS 應用都有一個音頻會話。這個會話能夠被 AVAudioSession 類的 sharedInstance 類方法訪問,以下:
session

AVAudioSession *audioSession = [AVAudioSession sharedInstance];複製代碼

在得到一個 AVAudioSession 類的實例後,你就能經過調用音頻會話對象的 setCategory:error:實例方法,來從 iOS 應用可用的不一樣類別中做出選擇。框架

下面列出了可供使用的音頻會話類別:

AVAudioSessionCategoryAmbientui

這個類別不會中止其餘應用的聲音,相反,它容許你的音頻播放於其餘應用的聲音之 上,好比 iPod。你的應用的主 UI 線程會工做正常。調用 AVAPlayerprepareToPlay 和 play 方法都將返回 YES。spa

AVAudioSessionCategorySoloAmbient

這個很是像 AVAudioSessionCategoryAmbient 類別,除了會中止其餘程序的音頻回放,好比 iPod 程序。當設備被設置爲靜音模式,你的音頻回放將會中止。線程

AVAudioSessionCategoryRecordcode

這會中止其餘應用的聲音(好比 iPod)並讓你的應用也不能初始化音頻回放(好比 AVAudioPlayer)。在這種模式下,你只能進行錄音。使用這個類別,調用 AVAudioPlayerprepareToPlay 會返回 YES,可是調用 play 方法將返回 NO。主 UI 界面會照常工做。這時, 即便你的設備屏幕被用戶鎖定了,應用的錄音仍會繼續。視頻

AVAudioSessionCategoryPlayback對象

這個類別會禁止其餘應用的音頻回放(好比 iPod 應用的音頻回放)。你可使用 AVAudioPlayer 的 prepareToPlay 和 play 方法,在你的應用中播放聲音。主 UI 界面會照常工做。這時,即便屏幕被鎖定或者設備爲靜音模式,音頻回放都會繼續。開發

AVAudioSessionCategoryPlayAndRecord

這個類別容許你的應用中同時進行聲音的播放和錄製。當你的聲音錄製或播放開始後, 其餘應用的聲音播放將會中止。主 UI 界面會照常工做。這時,即便屏幕被鎖定或者設備爲 靜音模式,音頻回放和錄製都會繼續。

AVAudioSessionCategoryAudioProcessing

這個類別用於應用中進行音頻處理的情形,而不是音頻回放或錄製。設置了這種模式, 你在應用中就不能播放和錄製任何聲音。調用 AVAPlayerprepareToPlayplay 方法都將 返回 NO。其餘應用的音頻回放,好比 iPod,也會在此模式下中止。

解決方案:當咱們本身開發的應用播放時,暫停其餘應用的播放,當咱們的應用播放完畢時,繼續其餘應用的播放,核心代碼以下:

具體實現

後臺音樂播放暫停與繼續

// 繼續播放後臺背景音樂, 取消激活當前應用的audio session
+ (void)resumeBackgroundSoundWithError:(NSError **)error {
    [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:error];
}
  
//暫停後臺背景音樂的播放,激活當前應用的audio
+ (void)pauseBackgroundSoundWithError:(NSError **)error {
    
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayback withOptions: AVAudioSessionCategoryOptionAllowBluetooth error:error];
    [session setActive:YES error:error];
}
  
+ (void)pauseBackgroundSoundWithCategoryRecord {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryRecord error:nil];
    [session setActive:YES error:nil];
}
複製代碼

注:

  1. Category的選擇,取決於在激活應用的audio session時,下一步要錄音仍是播放,若是錄音的話,必定要設置categoryAVAudioSessionCategoryRecord
  2. 若是是播放,那就設置AVAudioSessionCategoryPlayback
  3. 若是準備要錄音,而設置成了AVAudioSessionCategoryPlayback,可能會獲得一個意想不到的的結果Unexpected error or warning
相關文章
相關標籤/搜索