iOS AVAudioSession、AudioSession Category选择和声音通道听筒、扬声器切换

    xiaoxiao2021-03-25  109

    原文

    选择一个Category

    pragma mark – Values for the category property –

    /*  Use this category for background sounds such as rain, car engine noise, etc.  

     Mixes with other music. */

    AVF_EXPORT NSString *const AVAudioSessionCategoryAmbient;

    /*  Use this category for background sounds.  Other music will stop playing. */

    AVF_EXPORT NSString *const AVAudioSessionCategorySoloAmbient;

    /* Use this category for music tracks.*/

    AVF_EXPORT NSString *const AVAudioSessionCategoryPlayback;

    /*  Use this category when recording audio. */

    AVF_EXPORT NSString *const AVAudioSessionCategoryRecord;

    /*  Use this category when recording and playing back audio. */

    AVF_EXPORT NSString *const AVAudioSessionCategoryPlayAndRecord;

    /*  Use this category when using a hardware codec or signal processor while

     not playing or recording audio. */

    AVF_EXPORT NSString *const AVAudioSessionCategoryAudioProcessing;

    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下声音的默认出口为听筒(在没有外接设备的情况下)。

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

    设置Category

    NSError *setCategoryError = nil;  

    BOOL success = [[AVAudioSession sharedInstance]  

                    setCategory: AVAudioSessionCategoryAmbient  

                    error: &setCategoryError];  

      

    if (!success) { /* handle the error in setCategoryError */ }  

     

    Activate & Deactivate AudioSession

     

    NSError *error = nil;  

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];  

    BOOL ret = [audioSession setActive:YES error:&error];  

    if (!ret)  

    {  

        NSLog(@”%s - activate audio session failed with error %@”, __func__,[error description]);  

    }  

    NSError *error = nil;  

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];  

    //Note: Set AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation to resume other apps’ audio.  

    BOOL ret = [audioSession setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];  

    if (!ret)  

    {  

    }  

     

    Audio Route的选择

    当你的iPhone接有多个外接音频设备时(耳塞,蓝牙耳机等),AudioSession将遵循last-in wins的原则来选择外接设备,即声音将被导向最后接入的设备。

    当没有接入任何音频设备时,一般情况下声音会默认从扬声器出来,但有一个例外的情况:在PlayAndRecord这个category下,听筒会成为默认的输出设备。如果你想要改变这个行为,可以提供MPVolumeView来让用户切换到扬声器,也可通过overrideOutputAudioPort方法来programmingly切换到扬声器,也可以修改category option为AVAudioSessionCategoryOptionDefaultToSpeaker。

     

    PlayandRecord下切换到扬声器

    除了让用户手动选择,你也可以通过以下两种方法在程序里进行切换

    1. 修改Category的默认行为:

     

    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];  

    2. OverrideOutputAudioPort:

     

    [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; 

    这两种方法的区别官方文档中有详细的说明

    在iOS7.0之前可用下面方法重定向(属于AudioSession)

    audio route属性有以下两个,一个是默认的听筒,另一个则是扬声器。

     

    enum {        kAudioSessionOverrideAudioRoute_None    = 0,      kAudioSessionOverrideAudioRoute_Speaker = ‘spkr’   };  

    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;              AudioSessionSetProperty (                                kAudioSessionProperty_OverrideAudioRoute                                sizeof (audioRouteOverride),                                &audioRouteOverride                                );  

    UInt32 doChangeDefaultRoute = 1;              AudioSessionSetProperty (                                kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,                                sizeof (doChangeDefaultRoute),                                &doChangeDefaultRoute                                );  

    google翻译: 技术问答QA1754 AVAudioSession - AVAudioSessionPortOverrideSpeaker和AVAudioSessionCategoryOptionDefaultToSpeaker之间的差异

    问:你能否解释一下调用AVAudioSession方法之间的差异overrideOutputAudioPort:与价值AVAudioSessionPortOverrideSpeaker,并使用类别选项AVAudioSessionCategoryOptionDefaultToSpeaker用setCategory:withOptions:error:。

    A:区别在于,AVAudioSessionPortOverride通过调用设置overrideOutputAudioPort:比使用category选项更加短暂AVAudioSessionCategoryOptionDefaultToSpeaker。

    重要: 两者的使用AVAudioSessionPortOverrideSpeaker和AVAudioSessionCategoryOptionDefaultToSpeaker仅适用于AVAudioSessionCategoryPlayAndRecord类别。 调用overrideOutputAudioPort:和设置AVAudioSessionPortOverrideto AVAudioSessionPortOverrideSpeaker是临时覆盖要播放到扬声器的输出的一种方式。任何路由改变或中断将导致音频被路由回到其正常路由,遵循最后入胜的规则。想想使用overrideOutputAudioPort:什么可以用来实现一个扬声器电话按钮,你想要能够在扬声器(AVAudioSessionPortOverrideSpeaker)和正常的输出路由(AVAudioSessionPortOverrideNone)之间切换。

    注意: 此属性旨在允许第三方应用程序模拟扬声器按钮的行为,因此可能更改输入路由以及输出路由。例如,将耳机插入时将设置AVAudioSessionPortOverride为AVAudioSessionPortOverrideSpeaker,将使路由更改为内置麦克风/内置扬声器。 实现免提功能的首选方法是使用MPVolumeView“路由”按钮。

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

    使用AVAudioSessionCategoryOptionDefaultToSpeaker时,用户手势将被授予。例如,插入耳机将导致路由更改为耳机麦克风/耳机,拔下耳机将导致路由更改为内置麦克风/扬声器(与内置麦克风/接收器相反),当此覆盖具有已设置。

    在使用USB输入专用附件的情况下,音频输入将来自附件,并且如果耳机未插入,则输出将路由到耳机(如果附接)或扬声器。用例仅是将音频路由到扬声器而不是在音频通常去往接收器的情况下。此选项是类别的修饰符。

    路线更改和中断不会重置此覆盖。只有更改AVAudioSession类别将导致此选项被重置

    转载请注明原文地址: https://ju.6miu.com/read-14959.html

    最新回复(0)