混合和非混合模式之间的 AVAudioSession 切换

Ant*_*nio 6 video avfoundation ios avaudiosession avplayer

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

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

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

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

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

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

打开混音模式

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryAmbient
         withOptions:AVAudioSessionCategoryOptionMixWithOthers
               error:nil];
[session setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
Run Code Online (Sandbox Code Playgroud)

关闭混音模式

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback
         withOptions:0
               error:nil];
[session setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
Run Code Online (Sandbox Code Playgroud)

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

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

有谁知道如何解决这些问题?欢迎任何解决方案,即使是非常复杂或使用私有 API 的解决方案。

小智 0

也许您应该在“关闭混合模式”块中将“是”更改为“否”。

[session setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
Run Code Online (Sandbox Code Playgroud)