iOS AVAudioSession 详解

37 阅读2分钟

AVAudioSession

简要说说AVAudioSession,AVAudioSession是苹果用来管理App对音频硬件(I / O)的资源使用;比如说:

  • 设置APP与其他APP是否混音,或者中断、降低其他App声音
  • 手机静音下,APP是否可以播放声音
  • 指定音频输入或者输出设备
  • 是否支持APP录制,是否可以边录制边播放
  • 声音中断的优先级(电话接入中断APP音频处理)

在APP的运行过程中,AudioSession的配置影响所有的音频活动。你可以查询Audio Session来发现设备的硬件特性。如声道数(channel count)、采样率(sample rate)、和音频输入的可用性(availability of audio unit)

AVAudioSession 激活

/* 设置为激活或者失活。激活音频会话是一个同步(阻塞)操作 */
- (BOOL)setActive:(BOOL)active 
       error:(NSError * _Nullable *)outError;
/* 调用该方法 通知中断的应用程序中断已经结束,它可以恢复播放,仅在会话停用时有效
active:NO
options:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation  */
- (BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError **)outError;

AVAudioSession 硬件设置

/* 首选硬件采样率 */
- (BOOL)setPreferredSampleRate:(double)sampleRate error:(NSError **)outError
/* 首选的硬件IO缓冲区持续时间(以秒为单位) */
- (BOOL)setPreferredIOBufferDuration:(NSTimeInterval)duration error:(NSError **)outError
// 输入通道数
- (BOOL)setPreferredInputNumberOfChannels:(NSInteger)count error:(NSError **)outError
// 输出通道数
- (BOOL)setPreferredOutputNumberOfChannels:(NSInteger)count error:(NSError **)outError
// 设置立体声方向
- (BOOL)setPreferredInputOrientation:(AVAudioStereoOrientation)orientation error:(NSError **)outError
// 使用此方法可临时覆盖内置扬声器的输出
- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride error:(NSError **)outError
设置音频输出方式

当iPhone接入多个外部设备时,AudioSeesion将遵循last-in wins原则(后入为主),即声音将被导向到最后接入的设备。在没有接入任何设备时,一般情况下声音会默认从扬声器发出,但有一个例外:在使用AVAudioSessionCategoryPlayAndRecord这种category下,听筒成为默认的输出设备。
如果需要改变扬声器的输出,有以下几种方式:

  • 方式一:调用音频输出方法 overrideOutputAudioPort:  (这种方式调用更短暂)
    如果选择扬声器输出,设置为AVAudioSessionPortOverrideSpeaker;
    如果默认状态输出,设置为AVAudioSessionPortOverrideNone;

  • 方式二:设置AVAudioSessionCategoryOption
    如果选择扬声器输出,设置为AVAudioSessionCategoryOptionDefaultToSpeaker;
    如果默认状态输出,不设置;