IOS你不知道的音频细节,音频会话AVAudioSession

名称

音频会话

解释

设置程序的音频环境,告知系统的音频行为用途。管理多个app对音频硬件的资源分配。通过主场景、模式、细节选项的设置可以使app在音频方面更加人性化。

疑问

有人说,我写音乐播放的时候没有考虑这个都能播放,这个有啥用?当你想要做的更人性化时就该考虑下这点,比如说插耳机、拔耳机的逻辑,是否控制后台播放,是否让当前app的声音高于其他app的声音等。

理论

音频会话场景分类设置:

说明:以下分类并不是一个应用只能使用一个分类,可以根据场景来切换不同的分类。

1、主场景分类;

主场景Category 描述 可与其他app共享混合播放 是否可播放 是否可录音 静音按钮或者锁屏按钮点击后是否会停止静音 是否可在后台运行
AVAudioSessionCategoryAmbient 背景声音,可以与其他音乐混合,用于以非语音为主的应用 可混合 可播放 不可录音 会静音 不可运行
AVAudioSessionCategorySoloAmbient 默认分类,背景声音 不可混合 可播放 不可录音 会静音 不可运行
AVAudioSessionCategoryPlayback 用于播放音乐,用于以语音为主的应用 不可混合 可播放 不可录音 不会静音 可运行(另说明)
AVAudioSessionCategoryRecord 用于录音,除了来电铃声、闹钟、日历提醒等系统声音外其他声音都不会被播放,只执行录音 不可混合 不可播放 可录音 不会静音(锁屏仍可录制) 可运行
AVAudioSessionCategoryPlayAndRecord 用于播放和录音同时存在时,只有它允许修改默许音频播放设备:听筒还是外放,在该Category下声音的默认出口为听筒或者耳机。 默认不引起 可播放 可录音 不会静音 可运行
AVAudioSessionCategoryMultiRoute 多种输入输出,例如可以耳机、USB设备同时播放 不可混合 可播放 可录音 不会静音 可运行
AVAudioSessionCategoryAudioProcessing 硬件解码音频 不支持 不可播放 不可录音 不会静音 不可运行,可请求更多时间完成处理

说明:当使用AVAudioSessionCategoryPlayback分类时,要想实现后台播放,需要在Info.plist文件里添加Required background modes的数组,在下面添加名为App plays audio or streams audio/video using AirPlay的字符串

2、主场景细节options设置;

选项 兼容的场景 用途 描述
AVAudioSessionCategoryOptionMixWithOthers AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute 支持和其他APP音频混合
AVAudioSessionCategoryOptionDuckOthers AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute 导航地图 系统智能调低其他APP音频音量,突出本app的音量
AVAudioSessionCategoryOptionAllowBluetooth AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayAndRecord 支持蓝牙音频输入
AVAudioSessionCategoryOptionDefaultToSpeaker AVAudioSessionCategoryPlayAndRecord 设置默认输出音频到扬声器,即免提
AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers AVAudioSessionCategoryPlayback AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryMultiRoute app偶尔的使用音频播放
AVAudioSessionCategoryOptionAllowBluetoothA2DP AVAudioSessionCategoryPlayAndRecord 立体声蓝牙
AVAudioSessionCategoryOptionAllowAirPlay AVAudioSessionCategoryPlayAndRecord 远程AirPlay设备

3、主场景模式modes设置;

模式 兼容的场景 用途 描述
AVAudioSessionModeDefault 所有场景 默认模式 通用
AVAudioSessionModeVoiceChat AVAudioSessionCategoryPlayAndRecord Voice over IP语音应用 系统会选择最佳的输入设备,比如插上耳机就使用耳机上的麦克风进行采集
AVAudioSessionModeGameChat AVAudioSessionCategoryPlayAndRecord 游戏录制 适用于游戏App的采集和播放
AVAudioSessionModeVideoRecording AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord 录制视频时
AVAudioSessionModeMeasurement AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayback 最小化系统
AVAudioSessionModeMoviePlayback AVAudioSessionCategoryPlayback 视频播放 系统也会选择最佳的输入设备,比如插上耳机就使用耳机上的麦克风进行采集
AVAudioSessionModeVideoChat AVAudioSessionCategoryPlayAndRecord 视频通话
AVAudioSessionModeSpokenAudio AVAudioSessionCategoryPlayback AVAudioSessionCategorySoloAmbient AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryMultiRoute 有声读物 播放语音并暂停其他语音app

处理中断事件

1.当收到中断通知后,userInfo传值的字典包含AVAudioSessionInterruptionTypeKey类型值,

2.当这个类型等于 AVAudioSessionInterruptionTypeBegan时,表示开始中断。

3.当这个类型等于 AVAudioSessionInterruptionTypeEnded时,表示中断结束userInfo字典会传回一个 AVAudioSessionInterruptionOptionKey 值,当这个值等于AVAudioSessionInterruptionOptionShouldResume时,表明音频会话是否已经重新激活,以及是否可以再次播放。

线路改变事件

1.当收到线路变换通知后,userInfo传值的字典包含AVAudioSessionRouteChangeReasonKey值。

2.当这个值等于AVAudioSessionRouteChangeReasonOldDeviceUnavailable时,表示有设备断开。根据人性化原则,在耳机拔出时应该使正在播放的声音暂停。

3.当这个值等于AVAudioSessionRouteChangeReasonNewDeviceAvailable时,表示有设备连接。

核心代码

import <AVFoundation/AVFoundation.h>

该代码应写在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {这个方法里

 //设置音频会话
    AVAudioSession * session = [AVAudioSession sharedInstance];
    NSError * error;
    //设置会话的场景、选项、模式
    if( ![session setCategory:AVAudioSessionCategoryPlayback error:&error])
    {
        NSLog(@"音频会话分类设置出错:%@",[error localizedDescription]);
    }
    
    //激活会话
    if(![session setActive:YES error:&error])
    {
        NSLog(@"音频会话分类设置出错:%@",[error localizedDescription]);
    }
/**
 接收中断通知
 */
-(void)notification_Interrupt:(NSNotification *)sender
{
    NSDictionary * dic_info = sender.userInfo;
    
    AVAudioSessionInterruptionType type = [dic_info[AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
    if(type == AVAudioSessionInterruptionTypeBegan)
    {
        //表示中断开始
        //TODO.. 处理中断后的操作,系统会自动停止音频,在这里可以实现工作:保存播放状态,更改UI状态为暂停状态等。
    }
    else if(type == AVAudioSessionInterruptionTypeEnded)
    {
        //表示中断结束
        AVAudioSessionInterruptionOptions options = [dic_info[AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
        if(options == AVAudioSessionInterruptionOptionShouldResume)
        {
            //表示可以继续播放
            //TODO...系统不回自动恢复播放,在这里可以实现工作:自动播放,更改UI状态为播放状态。
        }
    }
    
}

/**
 接收线路变换通知

 @param sender <#sender description#>
 */
-(void)notification_routeChange:(NSNotification *)sender
{
    NSDictionary * dic_info = sender.userInfo;
    
    AVAudioSessionRouteChangeReason reason = [dic_info[AVAudioSessionRouteChangeReasonKey] unsignedIntegerValue];
    if(reason == AVAudioSessionRouteChangeReasonNewDeviceAvailable)
    {
        //表示有新设备接入
        //TODO...
    }
    else if(reason == AVAudioSessionRouteChangeReasonOldDeviceUnavailable)
    {
        //表示有设备拔出
        
        //拔出之前的线路信息
        AVAudioSessionRouteDescription * previousRoute =  dic_info[AVAudioSessionRouteChangePreviousRouteKey];
        //拔出之前的输出线路
        AVAudioSessionPortDescription * previousOutput = previousRoute.outputs[0];
        NSString * portType = previousOutput.portType;//端口类型
        
        if([portType isEqualToString:AVAudioSessionPortHeadphones])
        {
            //表示是耳机设备拔出,根据人性化根据,耳机拔出后,正在播放的声音应停止播放
            //TODO..
        }
    }
}

QQ :384302147

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容