iOS PiP模式下如何停止播放:同应用播放不兼容格式时的处理方案问询
同应用内PiP播放时播放器切换事件监听方案
首先明确问题根因:Audio Interruption Notification 仅响应跨应用音频抢占、来电等系统级中断事件,同应用内部的播放器切换属于业务层行为,不会触发系统级音频中断通知,因此无法通过该方案监听。
全平台通用最优方案
- 播放器库对外暴露两个核心接口:
isInPiPMode()(查询当前是否处于PiP播放状态)、stopPiPPlayback()(主动终止PiP并释放资源) - 由宿主App做全局播放逻辑管控:宿主在每次触发新视频播放前,先调用
isInPiPMode()判断是否存在活跃的PiP播放,若存在且待播放视频格式不兼容,主动调用stopPiPPlayback()终止当前播放后再拉起其他播放器。该方案无系统版本兼容问题,稳定性最高。
Android 端备选方案
若无法协调宿主App做全局状态管控,可通过音频焦点监听实现:
在播放器初始化时申请音频焦点,注册音频焦点变更监听,同应用内其他播放器申请音频焦点时你会收到丢失焦点回调,此时主动关闭PiP即可,示例代码:
val audioFocusChangeListener = OnAudioFocusChangeListener { focusChange -> if (focusChange == AudioManager.AUDIOFOCUS_LOSS) { // 丢失音频焦点,终止PiP播放 stopPiPPlayback() } } // 申请音频焦点 audioManager.requestAudioFocus(audioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN)
iOS 端备选方案
通过监听音频会话属性变化实现:
给AVAudioSession的secondaryAudioShouldBeSilencedHint属性添加KVO监听,同应用内其他播放器启动播放时该属性会变为true,此时触发PiP关闭逻辑即可,示例代码:
// 注册KVO监听 audioSession.addObserver(self, forKeyPath: "secondaryAudioShouldBeSilencedHint", options: [.new], context: nil) // 监听回调 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "secondaryAudioShouldBeSilencedHint", let isSilenced = change?[.newKey] as? Bool, isSilenced { // 同应用有其他音频播放,关闭PiP stopPiPPlayback() } }
内容的提问来源于stack exchange,提问作者himanshu garg
相关产品推荐
相关产品推荐

