gpt4 book ai didi

ios - AVAudioSession 在混合和非混合模式之间切换

转载 作者:行者123 更新时间:2023-11-29 12:11:17 25 4
gpt4 key购买 nike

我有一个可以显示视频的应用,我想要以下行为。

  • 当视频首次出现在屏幕上并开始播放时,它的音频应该与可能已经在播放的其他应用的音频混合在一起。例如,如果用户正在收听 Spotify,他们应该听到来自 Spotify 和正在播放的视频的音频。

  • 如果用户点击特定按钮,则应将其他应用的音频静音,以便仅播放视频中的音频。

  • 如果用户再次点击按钮,来自其他应用的音频应该恢复并且视频的音频与来自其他应用的音频应该再次混合。

基本上,我希望能够在“混音”和“非混音”之间切换应用的音频模式。

下面是一些代码,展示了我如何修改 AVAudioSession 以尝试获得此功能。

开启混合模式

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryAmbient
withOptions:AVAudioSessionCategoryOptionMixWithOthers
error:nil];
[session setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];

关闭混合模式

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback
withOptions:0
error:nil];
[session setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];

我遇到的问题是,在之前关闭音频混合后打开它,不会通知其他应用它们可以再次恢复播放音频。我真的,真的想要那种行为。这是不可能的事情吗。

似乎通知其他应用程序可以恢复的唯一方法是将我的应用程序的 Audio Session 设置为“不活动”。不幸的是,在播放视频时执行此操作会导致在控制台中打印出一条警告,提示我应该在停用 Audio Session 之前停止播放音频。这也有基本上破坏 AVPlayer 的效果,因为它不能再播放任何音频。

有人知道如何解决这些问题吗?任何解决方案都将受到欢迎,即使是非常复杂或使用私有(private) API 的解决方案。

最佳答案

正如其他答案所指出的那样,您可以“暂停”另一个应用程序的音频。但是,您可以使用 .duckWithOthers 将其关闭。音频结束后,您可以将该选项重置回 .mixWithOthers 并通知其他应用它们的音量可以恢复到完整级别。

让我们假设您的音频在 ViewController 出现时开始,在 ViewController 消失时停止。然后你可以使用下面的代码:

override func viewWillAppear(_ animated: Bool) {
super.viewDidAppear(animated)

// Use duckOthers so the audio in your VC is slightly louder than the background audio such as Spotify
updateAVAudioSessionOptions(to: .duckOthers)
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)

// Reset to mixWithOthers since we are no longer playing audio
updateAVAudioSessionOptions(to: .mixWithOthers)

// probably a good idea to stop the audio as well
player.pause()
}

private func updateAVAudioSessionOptions(to options: AVAudioSession.CategoryOptions) {
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: options)

if options == .mixWithOthers {
// Notify other apps that they volume can be restored to the full level
try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}

} catch let error {
print("Error: \(error)")
}
}

关于ios - AVAudioSession 在混合和非混合模式之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33386405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com