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

  • 当视频首次出现在屏幕上并开始播放时,其音频应与可能已经在播放的其他应用程序的音频混合。例如,如果用户正在收听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的解决方案也是如此。

    最佳答案

    我觉得你不走运。甚至AVAudioSessionCategoryOptionDuckOthers(听起来像应该适合您的用例)也要求您停用 session 以使其他应用的音量恢复正常,但是如您所见,这会导致错误。

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

    10-14 17:30