Skip to content

audioSession

Sidney edited this page Dec 5, 2017 · 1 revision

如何正确处理AVAudioSession?

播放器音频操作

当每次点击开播时,播放器会自动做active(激活) AVAudioSession操作:

NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionDefaultToSpeaker |AVAudioSessionCategoryOptionAllowBluetoothA2DP error:&error];
[[AVAudioSession sharedInstance] setActive:YES error:&error];

当播放器完成后,不会主动调用deactive AVAudioSession操作。

此时和第三方音乐播放器的交互如下:

  1. 音乐播放器播放音乐;
  2. 音乐播放器切后台继续播放;
  3. 集成播放器的APP启动;
  4. APP开始直播或者点播流,此时active AVAudioSession,后台第三方音乐播放器暂停;
  5. APP停止播放,后续在APP内持续操作过程中音乐播放器没有声音播出;
  6. 切到第三方音乐播放器主动点播播放,开始播放音乐。

如果希望更改第5、6步现象为:当APP停止播放后,第三方音乐播放器立即回到音乐播放状态。需要APP开发做如下操作:

在用户点击播放器stop操作,或者播放器finish通知里面,主动执行deactive AVAudioSession操作:

NSError *error = nil;
[[AVAudioSession sharedInstance]setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];

如果deactive AVAudioSession时不携带AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation选项,仍然不能将之前打断的音乐APP重新激活起来。

播放过程中操作AVAudioSession

当使用播放器播放直播或者点播流时,调用第三方播放器播放语言信息后,可能出现以下log:

AVAudioSession.mm:692: -[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. 
All I/O should be stopped or paused prior to deactivating the audio session.

出现该log后,将导致播放器不再播放声音。

出现的原因是第三方播放器或者其他方面调用了以下操作,deactive AVAudioSession。

NSError *error = nil;
[[AVAudioSession sharedInstance] setActive:NO error:&error];

此时需要APP主动active AVAudioSession:

NSError *error = nil;
[[AVAudioSession sharedInstance] setActive:YES error:&error];