本文部分翻译了官方对这两个属性的描述,链接如下,此外加入个人的使用体会
https://developer.apple.com/library/archive/qa/qa1754/_index.html
问题的起源,在iOS播放声音时,输出到扬声器的需求,两个属性设置的区别:
The difference is that setting the AVAudioSessionPortOverride by calling overrideOutputAudioPort: is more transient than using the category option AVAudioSessionCategoryOptionDefaultToSpeaker.
通过overrideOutputAudioPort这个方法设置属性AVAudioSessionPortOverride,比使用AVAudioSessionCategoryOptionDefaultToSpeaker这个属性更短暂。
方法1:
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
方法2 :
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
方法1设置之后,如果此时插入耳机,再拔掉,播放的声音会从听筒输出,而不是回到扬声器。
方法2设置之后,如果没有耳机,则始终输出到扬声器而不是其他接收器(简要的说,就是如果有个蓝牙音箱,哪怕接上都不会有声音输出到蓝牙音箱。插上耳机,才会有声音输出到耳机)。
这里有个很重要的地方,这两个属性都只被用于 AVAudioSessionCategoryPlayAndRecord category。
使用场景的补充:
如果在某个场景下,希望强制从speaker输出声音,最好使用 AVAudioSessionCategoryPlayback 而不是 AVAudioSessionCategoryPlayAndRecord,因为在无外接设备的情况下,后者默认从听筒输出声音。
[session setCategory:AVAudioSessionCategoryPlayback error:&error];
在需要使用扬声器和听筒切换的场景,用AVAudioSessionCategoryPlayAndRecord这个category。如果在使用听筒之后,在AVAudioSessionCategoryPlayAndRecord这个category下要切换到扬声器的方法:
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];
CGFloat volume = audioSession.outputVolume;
_player.volume = volume;