美文网首页good语音视频后台处理
AVAudioSession音频会话(类别选择/音频输出切换)

AVAudioSession音频会话(类别选择/音频输出切换)

作者: Calvin_Shen | 来源:发表于2018-11-20 10:06 被阅读72次

    简介
    音频会话是一个Singleton对象,您可以使用它来设置应用程序的音频上下文环境,并向系统表达您的应用程序音频行为的意图。
    使用此类可以:

    • 启用或停用应用程式的音讯工作阶段
    • 设置音频会话类别和模式,以便与系统通信如何在您的应用程序中使用音频
    • 配置音频设置,如采样率,I / O缓冲区持续时间和通道数
      处理音频输出更改
    • 响应重要的音频事件,例如更改底层Media Services守护程序的可用性

    AVAudioSession使用

    AVAudioSession类由AVFoundation框架引入。每个iOS应用都有一个音频会话。这个会话可以被AVAudioSession类的sharedInstance类方法访问。在获得一个AVAudioSession类的实例后,就能通过音频会话单例对象的setCategory:error:方法,来设置iOS应用音频会话类别模式。通过overrideOutputAudioPort:error:方法设置音频会话的overrideOutputAudioPort属性, 或者通过setCategory:withOptions:error:方法来设置音频会话的Audio Route.

    NSError *sessionError = nil;
    AVAudioSession *audioSession=[AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
    
    if(sessionError){
        NSLog(@"Error creating session: %@", [sessionError description]);
    }else{
        [audioSession setActive:YES error:nil];
    }
    

    AVAudioSessionCategory(会话类别的选择)

    文章上面说过, 通过音频会话单例对象的setCategory:error:方法,来设置iOS应用语音会话类别和模式。

    AVAudioSessionCategoryAmbient 或 kAudioSessionCategory_AmbientSound

    用于非以语音为主的应用,使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音

    AVAudioSessionCategorySoloAmbient 或 kAudioSessionCategory_SoloAmbientSound

    类似于AVAudioSessionCategoryAmbient 不同之处在于它会中止其它应用播放声音。 这个category为默认category。该Category无法在后台播放声音

    AVAudioSessionCategoryPlayback 或 kAudioSessionCategory_MediaPlayback

    用于以语音为主的应用,使用这个category的应用不会随着静音键和屏幕关闭而静音。可在后台播放声音.

    AVAudioSessionCategoryRecord 或 kAudioSessionCategory_RecordAudio

    用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。该Category只提供单纯录音功能。

    AVAudioSessionCategoryPlayAndRecord 或 kAudioSessionCategory_PlayAndRecord

    用于既需要播放声音又需要录音的应用,语音聊天应用(如微信)应该使用这个category。该Category提供录音和播放功能。如果你的应用需要用到iPhone上的听筒,该category是你唯一的选择,在该Category下声音的默认出口为听筒或者耳机。

    AVAudioSessionCategoryAudioProcessing 或 kAudioSessionCategory_AudioProcessing

    在不播放或录制音频时使用音频硬件编解码器或信号处理器的类别。例如,在执行离线音频格式转换时。此类别禁用播放(音频输出)和禁用录音(音频输入)。当您的应用处于后台时,音频处理通常不会继续。 但是,当您的应用移至后台时,您可以请求更多时间来完成处理。

    注意

    并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,举个例子,录音的时候,需要设置为AVAudioSessionCategoryRecord,当录音结束时,应根据程序需要更改category为AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一种。

    AudioSession Route 选择

    当你的iPhone接有多个外接音频接收设备时(耳机,蓝牙音箱等),AudioSession将遵循last-in wins的原则来选择外接设备,即声音将被导向最后接入的设备。
    当没有接入任何音频设备时,一般情况下声音会默认从扬声器出来,但有一个例外的情况:在PlayAndRecord这个category下,听筒会成为默认的音频输出设备。如果你想要改变这个行为,可以提供MPVolumeView来让用户切换到扬声器,也可通过overrideOutputAudioPort方法来programmingly切换到扬声器,也可以修改category option为AVAudioSessionCategoryOptionDefaultToSpeaker。
    所以, 他应用在扬声器,听筒,耳机,蓝牙音箱之间的切换。

    通过AVAudioSessionPortOverride选择音频输出

    通过overrideOutputAudioPort:error:方法和下面两个枚举来设置音频会话的overrideOutputAudioPort属性。

    [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:error];
    

    1
    AVAudioSessionPortOverrideNone

    不要覆盖输出音频端口。使用此选项将音频输出设备返回到当前音频类别的默认状态。

    AVAudioSessionPortOverrideSpeaker

    覆盖当前输入和输出,并将音频输出设备到内置扬声器和麦克风。仅适用于AVAudioSessionCategoryPlayAndRecord类别。

    通过AVAudioSessionCategoryOptions选择音频输出设备

    会话的类别和模式一起定义应用程序如何使用音频。通常,在激活会话之前设置类别和模式。您还可以在会话处于活动状态时设置类别或模式,但这会导致立即更改音频输出设备。

    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
    1
    AVAudioSessionCategoryOptions 枚举值:

    //Eligible Input
    AVAudioSessionPortUSBAudio
    AVAudioSessionPortHeadsetMic
    AVAudioSessionPortBuiltInMic

    //Eligible Output
    AVAudioSessionPortUSBAudio
    AVAudioSessionPortLineOut
    AVAudioSessionPortHeadphones
    AVAudioSessionPortHDMI
    AVAudioSessionPortBuiltInSpeaker
    overrideOutputAudioPort:设置和AVAudioSessionPortOverride设置的对比

    共同点

    AVAudioSessionPortOverrideSpeaker和AVAudioSessionCategoryOptionDefaultToSpeaker的使用仅适用于AVAudioSessionCategoryPlayAndRecord类别。

    区别

    通过调用overrideOutputAudioPort:设置AVAudioSessionPortOverride比使用类别选项AVAudioSessionCategoryOptionDefaultToSpeaker更加短暂。

    调用overrideOutputAudioPort:并将AVAudioSessionPortOverride设置为AVAudioSessionPortOverrideSpeaker是临时覆盖要向扬声器播放的输出的一种方法。任何音频输出改变或中断将导致音频被路由回到其正常输出设备,遵循最后入胜的规则。

    相反,AVAudioSessionCategoryOptionDefaultToSpeaker修改AVAudioSessionCategoryPlayAndRecord类别的路由行为,使得如果没有使用诸如耳机的其他附件,则音频将总是路由到扬声器而不是接收器。

    举个例子, 方法1, 设置之后,如果此时插入耳机,在拔掉。播放的声音会从听筒输出,而不是回到扬声器。
    方法2, 设置之后,始终输出到扬声器,而不是其他接收器,如果没有耳机。(简要的说,就是如果有个蓝牙音箱,哪怕接上都不会有声音输出到蓝牙音响,插上耳机,则会有声音输出到耳机。)


    作者:DCSnail-蜗牛
    来源:CSDN
    原文:https://blog.csdn.net/wangyanchang21/article/details/52925031

    相关文章

      网友评论

        本文标题:AVAudioSession音频会话(类别选择/音频输出切换)

        本文链接:https://www.haomeiwen.com/subject/lnrtqqtx.html