名稱
音頻會話
解釋
設(shè)置程序的音頻環(huán)境钝吮,告知系統(tǒng)的音頻行為用途埋涧。管理多個(gè)app對音頻硬件的資源分配。通過主場景奇瘦、模式棘催、細(xì)節(jié)選項(xiàng)的設(shè)置可以使app在音頻方面更加人性化。
疑問
有人說耳标,我寫音樂播放的時(shí)候沒有考慮這個(gè)都能播放醇坝,這個(gè)有啥用?當(dāng)你想要做的更人性化時(shí)就該考慮下這點(diǎn)次坡,比如說插耳機(jī)呼猪、拔耳機(jī)的邏輯呀袱,是否控制后臺播放,是否讓當(dāng)前app的聲音高于其他app的聲音等郑叠。
理論
音頻會話場景分類設(shè)置:
說明:以下分類并不是一個(gè)應(yīng)用只能使用一個(gè)分類夜赵,可以根據(jù)場景來切換不同的分類。
1乡革、主場景分類寇僧;
主場景Category | 描述 | 可與其他app共享混合播放 | 是否可播放 | 是否可錄音 | 靜音按鈕或者鎖屏按鈕點(diǎn)擊后是否會停止靜音 | 是否可在后臺運(yùn)行 |
---|---|---|---|---|---|---|
AVAudioSessionCategoryAmbient | 背景聲音,可以與其他音樂混合沸版,用于以非語音為主的應(yīng)用 | 可混合 | 可播放 | 不可錄音 | 會靜音 | 不可運(yùn)行 |
AVAudioSessionCategorySoloAmbient | 默認(rèn)分類嘁傀,背景聲音 | 不可混合 | 可播放 | 不可錄音 | 會靜音 | 不可運(yùn)行 |
AVAudioSessionCategoryPlayback | 用于播放音樂,用于以語音為主的應(yīng)用 | 不可混合 | 可播放 | 不可錄音 | 不會靜音 | 可運(yùn)行(另說明) |
AVAudioSessionCategoryRecord | 用于錄音视粮,除了來電鈴聲细办、鬧鐘、日歷提醒等系統(tǒng)聲音外其他聲音都不會被播放蕾殴,只執(zhí)行錄音 | 不可混合 | 不可播放 | 可錄音 | 不會靜音(鎖屏仍可錄制) | 可運(yùn)行 |
AVAudioSessionCategoryPlayAndRecord | 用于播放和錄音同時(shí)存在時(shí)笑撞,只有它允許修改默許音頻播放設(shè)備:聽筒還是外放,在該Category下聲音的默認(rèn)出口為聽筒或者耳機(jī)钓觉。 | 默認(rèn)不引起 | 可播放 | 可錄音 | 不會靜音 | 可運(yùn)行 |
AVAudioSessionCategoryMultiRoute | 多種輸入輸出茴肥,例如可以耳機(jī)、USB設(shè)備同時(shí)播放 | 不可混合 | 可播放 | 可錄音 | 不會靜音 | 可運(yùn)行 |
AVAudioSessionCategoryAudioProcessing | 硬件解碼音頻 | 不支持 | 不可播放 | 不可錄音 | 不會靜音 | 不可運(yùn)行荡灾,可請求更多時(shí)間完成處理 |
說明:當(dāng)使用AVAudioSessionCategoryPlayback分類時(shí)瓤狐,要想實(shí)現(xiàn)后臺播放,需要在Info.plist文件里添加Required background modes的數(shù)組批幌,在下面添加名為App plays audio or streams audio/video using AirPlay的字符串
2础锐、主場景細(xì)節(jié)options設(shè)置;
選項(xiàng) | 兼容的場景 | 用途 | 描述 |
---|---|---|---|
AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute | 支持和其他APP音頻混合 | |
AVAudioSessionCategoryOptionDuckOthers | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute | 導(dǎo)航地圖 | 系統(tǒng)智能調(diào)低其他APP音頻音量荧缘,突出本app的音量 |
AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayAndRecord | 支持藍(lán)牙音頻輸入 | |
AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryPlayAndRecord | 設(shè)置默認(rèn)輸出音頻到揚(yáng)聲器皆警,即免提 | |
AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers | AVAudioSessionCategoryPlayback AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryMultiRoute | app偶爾的使用音頻播放 | |
AVAudioSessionCategoryOptionAllowBluetoothA2DP | AVAudioSessionCategoryPlayAndRecord | 立體聲藍(lán)牙 | |
AVAudioSessionCategoryOptionAllowAirPlay | AVAudioSessionCategoryPlayAndRecord | 遠(yuǎn)程AirPlay設(shè)備 |
3、主場景模式modes設(shè)置胜宇;
模式 | 兼容的場景 | 用途 | 描述 |
---|---|---|---|
AVAudioSessionModeDefault | 所有場景 | 默認(rèn)模式 | 通用 |
AVAudioSessionModeVoiceChat | AVAudioSessionCategoryPlayAndRecord | Voice over IP語音應(yīng)用 | 系統(tǒng)會選擇最佳的輸入設(shè)備耀怜,比如插上耳機(jī)就使用耳機(jī)上的麥克風(fēng)進(jìn)行采集 |
AVAudioSessionModeGameChat | AVAudioSessionCategoryPlayAndRecord | 游戲錄制 | 適用于游戲App的采集和播放 |
AVAudioSessionModeVideoRecording | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord | 錄制視頻時(shí) | |
AVAudioSessionModeMeasurement | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayback | 最小化系統(tǒng) | |
AVAudioSessionModeMoviePlayback | AVAudioSessionCategoryPlayback | 視頻播放 | 系統(tǒng)也會選擇最佳的輸入設(shè)備恢着,比如插上耳機(jī)就使用耳機(jī)上的麥克風(fēng)進(jìn)行采集 |
AVAudioSessionModeVideoChat | AVAudioSessionCategoryPlayAndRecord | 視頻通話 | |
AVAudioSessionModeSpokenAudio | AVAudioSessionCategoryPlayback AVAudioSessionCategorySoloAmbient AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryMultiRoute | 有聲讀物 | 播放語音并暫停其他語音app |
處理中斷事件
1.當(dāng)收到中斷通知后桐愉,userInfo傳值的字典包含AVAudioSessionInterruptionTypeKey類型值,
2.當(dāng)這個(gè)類型等于 AVAudioSessionInterruptionTypeBegan時(shí)掰派,表示開始中斷从诲。
3.當(dāng)這個(gè)類型等于 AVAudioSessionInterruptionTypeEnded時(shí),表示中斷結(jié)束userInfo字典會傳回一個(gè) AVAudioSessionInterruptionOptionKey 值靡羡,當(dāng)這個(gè)值等于AVAudioSessionInterruptionOptionShouldResume時(shí)系洛,表明音頻會話是否已經(jīng)重新激活俊性,以及是否可以再次播放。
線路改變事件
1.當(dāng)收到線路變換通知后描扯,userInfo傳值的字典包含AVAudioSessionRouteChangeReasonKey值定页。
2.當(dāng)這個(gè)值等于AVAudioSessionRouteChangeReasonOldDeviceUnavailable時(shí),表示有設(shè)備斷開绽诚。根據(jù)人性化原則典徊,在耳機(jī)拔出時(shí)應(yīng)該使正在播放的聲音暫停。
3.當(dāng)這個(gè)值等于AVAudioSessionRouteChangeReasonNewDeviceAvailable時(shí)恩够,表示有設(shè)備連接卒落。
核心代碼
import <AVFoundation/AVFoundation.h>
該代碼應(yīng)寫在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {這個(gè)方法里
//設(shè)置音頻會話
AVAudioSession * session = [AVAudioSession sharedInstance];
NSError * error;
//設(shè)置會話的場景、選項(xiàng)蜂桶、模式
if( ![session setCategory:AVAudioSessionCategoryPlayback error:&error])
{
NSLog(@"音頻會話分類設(shè)置出錯(cuò):%@",[error localizedDescription]);
}
//激活會話
if(![session setActive:YES error:&error])
{
NSLog(@"音頻會話分類設(shè)置出錯(cuò):%@",[error localizedDescription]);
}
/**
接收中斷通知
*/
-(void)notification_Interrupt:(NSNotification *)sender
{
NSDictionary * dic_info = sender.userInfo;
AVAudioSessionInterruptionType type = [dic_info[AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
if(type == AVAudioSessionInterruptionTypeBegan)
{
//表示中斷開始
//TODO.. 處理中斷后的操作儡毕,系統(tǒng)會自動停止音頻,在這里可以實(shí)現(xiàn)工作:保存播放狀態(tài)扑媚,更改UI狀態(tài)為暫停狀態(tài)等腰湾。
}
else if(type == AVAudioSessionInterruptionTypeEnded)
{
//表示中斷結(jié)束
AVAudioSessionInterruptionOptions options = [dic_info[AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
if(options == AVAudioSessionInterruptionOptionShouldResume)
{
//表示可以繼續(xù)播放
//TODO...系統(tǒng)不回自動恢復(fù)播放,在這里可以實(shí)現(xiàn)工作:自動播放疆股,更改UI狀態(tài)為播放狀態(tài)檐盟。
}
}
}
/**
接收線路變換通知
@param sender <#sender description#>
*/
-(void)notification_routeChange:(NSNotification *)sender
{
NSDictionary * dic_info = sender.userInfo;
AVAudioSessionRouteChangeReason reason = [dic_info[AVAudioSessionRouteChangeReasonKey] unsignedIntegerValue];
if(reason == AVAudioSessionRouteChangeReasonNewDeviceAvailable)
{
//表示有新設(shè)備接入
//TODO...
}
else if(reason == AVAudioSessionRouteChangeReasonOldDeviceUnavailable)
{
//表示有設(shè)備拔出
//拔出之前的線路信息
AVAudioSessionRouteDescription * previousRoute = dic_info[AVAudioSessionRouteChangePreviousRouteKey];
//拔出之前的輸出線路
AVAudioSessionPortDescription * previousOutput = previousRoute.outputs[0];
NSString * portType = previousOutput.portType;//端口類型
if([portType isEqualToString:AVAudioSessionPortHeadphones])
{
//表示是耳機(jī)設(shè)備拔出,根據(jù)人性化根據(jù)押桃,耳機(jī)拔出后葵萎,正在播放的聲音應(yīng)停止播放
//TODO..
}
}
}