ios - 如果想在应用程序中将正在播放的视频静音时恢复用户的背景音频,如何以最小的中断最好地做到这一点?
问题描述
为标题道歉,解释起来有点棘手。
想象一下,用户在使用我的应用程序时正在后台收听 Spotify 或其他东西,然后他们点击视频来播放它。视频默认为静音,因此 Spotify 会继续播放。然后用户点击取消静音,因此 Spotify 将暂停,现在取消静音的视频音频将开始播放。
现在,事实证明视频的音频不是那么有趣,并且用户更喜欢听他们的音乐,所以这次用户点击静音,所以视频的音频停止并且 Spotify 应该恢复。
最后一点是障碍,当您将应用程序的音频会话设置为非活动时,它似乎需要暂停播放视频。我不希望它被暂停,我希望它继续播放(只是没有音频),但出于某种原因,这似乎是一种要求。
因此,作为回应,您似乎可以跳A)暂停视频,B)将音频会话设置为非活动状态,从而重新启用Spotify,C)取消暂停视频。但是如果你跳得太快,iOS 会生气,并把它当作你根本没有暂停它,可能会干扰视频的播放和输出:
停用正在运行 I/O 的音频会话。在停用音频会话之前,应停止或暂停所有 I/O
虽然没有完成处理程序或任何东西(我可以看到)来帮助您何时应该重新启用任何暂停的视频或诸如此类的东西,所以我使用了这段粗略的代码,我在其中引入了人为(猜测的)延迟:
// Pause it
player.pause()
videoControlsView?.isPaused = true
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
// Wait 0.1 seconds, set audio to inactive
do {
try AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default, options: [])
try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
} catch {
print(error)
}
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
// Wait 0.1 seconds, unpause
player.play()
player.isMuted = true
self.videoControlsView?.isMuted = true
}
}
但是尽管进行了相当多的测试,这段代码显然非常脆弱,不是我写过的最喜欢的。有没有合适的方法来做到这一点?
注意:激活(而不是停用)音频会话没有此类问题。
解决方案
推荐阅读
- haskell - 为什么我可以直接在 REPL 中从 typeclass 实例调用函数(比如从 Ord 进行比较)?
- python - 在 django 中使用两个匹配的外键时出错
- python - Python turtle 模块导致 OS X 崩溃
- macos - 使用 Applescript 在 Powerpoint 幻灯片中对齐照片
- java - SSL 连接问题 - 未发送所需的 SSL 证书
- hybris - 自定义必填字段的 Excel 导入不起作用 [Hybris 6.7.0]
- google-cloud-stackdriver - Stackdriver 监控的 CPU 类型和 CPU 利用率指标
- r - 使用summary.table时如何修复'object'必须从类“table”继承?
- php - 子域路由覆盖并运行 web.php 中的最后一个子域
- excel - 仅当行包含一个值时,将特定行复制到另一个工作表