未激活AudioSession时AVPlayer音乐为何停止?静音AVQueuePlayer为何打断后台音乐?
关于AVPlayer/AVQueuePlayer与AudioSession的两个问题解答
我来帮你逐个理清这两个问题的核心原因,以及对应的解决思路:
问题1:未手动设置AudioSession为活跃状态时,AVPlayer/AVQueuePlayer播放会停止后台音乐?
这是因为AVFoundation的播放组件会自动管理AudioSession的生命周期,哪怕你完全不手动干预。当你调用play方法后,AVPlayer会自动完成以下操作:
- 初始化共享的
AVAudioSession实例 - 默认将音频会话类别设置为
AVAudioSessionCategoryPlayback(适合媒体播放的类别) - 自动激活这个音频会话(相当于调用
setActive:YES)
而iOS系统的音频会话规则是:当一个新的、不支持混音的音频会话被激活时,会中断其他App正在后台播放的音频。这就是为什么你没手动设置AudioSession,后台音乐依然会停止的原因。
问题2:AVQueuePlayer静音播放m3u8时,后台音乐停止,是replaceCurrentItemWithPlayerItem触发了AudioSession设置?
首先明确:replaceCurrentItemWithPlayerItem本身不会直接修改或激活AudioSession,但当你调用play后,AVPlayer准备加载并播放媒体流(哪怕是静音状态)时,依然会触发上面提到的AudioSession自动初始化和激活流程。
另外要注意:播放器的静音设置只是控制自身的输出音量,和AudioSession的行为完全无关。哪怕你把muted设为YES,AVPlayer依然会正常请求音频会话的资源,而默认的AVAudioSessionCategoryPlayback类别不允许和其他音频混音,所以后台音乐还是会被中断。
解决方案:让播放器不中断后台音乐
如果你希望自己的App播放媒体时不打断其他App的后台音频,需要手动配置AudioSession的类别和选项,在播放前添加以下代码:
NSError *sessionError; AVAudioSession *audioSession = [AVAudioSession sharedInstance]; // 选项1:使用Ambient类别,会和后台音乐混音,但锁屏时播放器会暂停 BOOL success = [audioSession setCategory:AVAudioSessionCategoryAmbient error:&sessionError]; // 选项2:使用Playback类别并开启混音选项,锁屏时播放器可继续播放,同时不中断后台音乐 // BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback // withOptions:AVAudioSessionCategoryOptionMixWithOthers // error:&sessionError]; if (success) { [audioSession setActive:YES error:&sessionError]; }
这样配置后,你的音频会话就会允许和其他App的音频共存,不会再中断后台音乐了。
内容的提问来源于stack exchange,提问作者allenlinli
相关产品推荐
相关产品推荐

