IOS你不知道的音頻細(xì)節(jié),音頻會話AVAudioSession

名稱

音頻會話

解釋

設(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..
        }
    }
}

QQ :384302147

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市唱凯,隨后出現(xiàn)的幾起案子羡忘,更是在濱河造成了極大的恐慌,老刑警劉巖磕昼,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卷雕,死亡現(xiàn)場離奇詭異,居然都是意外死亡票从,警方通過查閱死者的電腦和手機(jī)漫雕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峰鄙,“玉大人浸间,你說我怎么就攤上這事∫髁瘢” “怎么了魁蒜?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我兜看,道長锥咸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任细移,我火速辦了婚禮搏予,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弧轧。我一直安慰自己缔刹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布劣针。 她就那樣靜靜地躺著校镐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捺典。 梳的紋絲不亂的頭發(fā)上鸟廓,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音襟己,去河邊找鬼引谜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛擎浴,可吹牛的內(nèi)容都是我干的员咽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼贮预,長吁一口氣:“原來是場噩夢啊……” “哼贝室!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仿吞,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤滑频,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后唤冈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峡迷,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年你虹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绘搞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡傅物,死狀恐怖夯辖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挟伙,我是刑警寧澤楼雹,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布模孩,位于F島的核電站尖阔,受9級特大地震影響贮缅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜介却,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一谴供、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧齿坷,春花似錦桂肌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至遂蛀,卻和暖如春谭跨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背李滴。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工螃宙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人所坯。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓谆扎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芹助。 傳聞我的和親對象是個(gè)殘疾皇子堂湖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容