iOS MPVolumeView 基于 AudioSession Mode 中断

Posted

技术标签:

【中文标题】iOS MPVolumeView 基于 AudioSession Mode 中断【英文标题】:iOS MPVolumeView breaks based on AudioSession Mode 【发布时间】:2015-12-17 23:29:14 【问题描述】:

我正在开发一个 VoIP 应用程序,它使用 MPVolumeView 来允许用户调整系统音量。在 ios 9.1 发布之前,这一切都运行良好。然后我发现如果我将AVAudioSession 模式设置为AVAudioSessionModeVoiceChatMPVolumeView 滑块就坏了。 (即滑块不再调节系统音量。)如果我将模式更改为AvAudioSessionModeDefaultMPVolumeView 将按预期工作,但我的麦克风会记录来自 iPad 扬声器的音频。 (换句话说,语音处理已关闭——我需要 VoIP 呼叫。)在 iOS 9.1 之前,我可以将 AudioSession 模式设置为AVAudioSessionModeDefault,然后在 AudioComponentDescription 中将 componentSubType 设置为kAudioUnitSubType_VoiceProcessingIO,一切正常美好的。不幸的是,情况似乎不再如此。有谁知道如何在 iOS 9.1 之后保持语音处理并让 MPVolumeView 工作?

这是我设置 AVAudioSession 的代码:

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    // Make sure the session on this thread matches.
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionAllowBluetooth error:nil];

    // Here is the main connundrum: I want to set AVAudioSessionModeDefault so that the MPVolumeView will work,
    // but when I do that the mic picks up the audio from the speaker and plays it back creating an unwanted feeback loop.
    // If I set the mode to AVAudioSessionModeVoiceChat the voice processing (primarily the AEC) fixes the feeback loop,
    // but then the MPVolumeView no longers works.  (It no longer adjusts the system volume.
    //Question: How can I have BOTH the voice processing AND the MPVolumeView adjust the system volume?
    if(!appDelegate.viewController.voiceChatMode)
        [audioSession setMode:AVAudioSessionModeDefault error:nil];
    else
        [audioSession setMode:AVAudioSessionModeVoiceChat error:nil];

    [audioSession setPreferredIOBufferDuration:0.005 error:nil];
    [audioSession setActive:YES error:nil];

【问题讨论】:

您问题中的代码在 iOS 9.2 上运行良好(MPVolumeView 在设置AVAudioSessionModeVoiceChat 模式时启用)。是否需要主动记录才能重现问题? 可能。在我的示例项目中,我让它录制音频并将其播放回扬声器,但当我让 VoIP 应用程序录制语音音频并播放来自另一个用户的音频时,这也是一个问题。你有它工作的例子吗?我问是因为我的简单测试失败了。 我所拥有的唯一示例完全符合您在上述代码 sn-p 中的操作,抱歉。 这仍然是使用 voicePrompt 模式的 iOS 13 上的问题。 【参考方案1】:

在与 Apple 的技术支持人员交谈后,这是他们直言不讳的回答:

根据 Core Audio 工程,MPVolumeView 不再调整系统音量的问题是一个已知问题 (r. 17292753),目前记录在我们的错误数据库中。

恐怕我不知道有什么办法可以解决这个问题。 否则,关于 VoIP 支持,建议聊天应用不要有音量滑块,而是依靠手机的音量按钮。

所以你有它。希望他们能尽快修复它...

【讨论】:

最近遇到了同样的问题。貌似四月份还没解决。

以上是关于iOS MPVolumeView 基于 AudioSession Mode 中断的主要内容,如果未能解决你的问题,请参考以下文章

MPVolumeView 和 iOS 5

如何在 iOS 中自定义 MPVolumeView?

MPVolumeView 未在 iOS 11 上显示音频路由

MPVolumeView 的滑块 setVolumeThumbImage:forState: 在 iOS5 上不起作用

更改 MPVolumeView 路由按钮 iOS 7 的颜色

带有 XCode 4 的 MPVolumeView(故事板)