iOS 是不是会降低使用麦克风的应用程序的扬声器音量?

Posted

技术标签:

【中文标题】iOS 是不是会降低使用麦克风的应用程序的扬声器音量?【英文标题】:Does iOS Reduce Speaker Volume for Apps Using a Microphone?iOS 是否会降低使用麦克风的应用程序的扬声器音量? 【发布时间】:2021-11-24 09:29:38 【问题描述】:

我正在开发一个用于实时音乐可视化的 Xcode/Swift/SwiftUI 应用程序。我允许用户按下按钮在麦克风输入和文件播放输入之间切换(但不能同时进行)。我的应用程序在我的 Mac 和 iPad 上运行良好,但在我的 iPhone 上,扬声器音频只有一半音量(并且似乎只来自后置扬声器)——即使我处于文件播放模式。我已将问题追溯到我的代码中的一个违规行 - 即声明

let mic = engine.inputNode // where engine = AVAudioEngine()

当我注释掉这一行时,iPhone 扬声器级别(用于文件播放模式)很好。但是当我取消评论时,iPhone 扬声器的音量几乎听不见。即使我将这条线包裹在有条件的if(micEnabled) 构造中,一开始的声音水平也很好;但是当我选择麦克风然后切换回文件播放时,音量再次降低。

我怀疑 ios 会检测到何时声明了麦克风并自动降低扬声器音量以避免音频反馈。这是有道理的,因为没有人希望在打电话时播放音乐。但是,如果他们想自己处理它,为开发人员提供一种覆盖此功能的方法也是有意义的。在我的情况下,对于麦克风输入的情况,我特意将音频流在被点击之后和进入扬声器之前分配为零音量。

我的源代码可用here。所有的音频代码都在 MuVis / Shared / AudioManager.swift 类中。

谁能帮我在我的 iPhone 上让文件播放模式以全音量工作 - 同时还允许用户选择麦克风输入模式?

【问题讨论】:

检查您的 AVAudioSession 的类别和选项。特别是,确保您没有启用.duckOthers。你配置了什么分类? (我假设.playAndRecord?) 我没有使用 AVAudioSession。我正在使用 AVAudioEngine。 你一直在使用 AVAudioSession。这就是您将应用程序的意图传达给操作系统的方式。如果您使用 AVAudioEngine,它会自动激活,但这并不意味着您不需要配置它。 感谢您的指导。到目前为止,我一直是纯粹的 macOS 开发人员。由于 AVAudioSession 在 macOS 中不可用,因此我避免了它。我刚刚尝试将 AVAudioSession 插入我的应用程序(在 #if os(iOS) 构造内)并将其类别设置为 playAndRecord,但这并不能解决我的 iPhone 音量问题。我将编辑我的问题以插入指向我的源代码的链接,希望您能指导我更多。 【参考方案1】:

非常感谢 Rob Napier 为我指明了解决问题的正确方向。

作为仅 macOS 的开发人员,我忽略了 AVAudioSession(因为它会导致 macOS 上的编译器错误)。当我将我的 MuVis 应用程序从仅 macOS 转换为多平台时,我只需使用适当的多平台设置启动一个新的 Xcode 项目,然后将现有代码粘贴到 shared 文件夹中。在清理了一些错误(主要是调用NSObject)之后,它神奇地在所有Apple平台上运行——除了我的问题中描述的iPhone音频问题。经过一些研究和反复试验,我发现我的音频音量问题通过将以下代码插入到我的setupAudio()函数中得到解决:

    #if os(iOS)
        // For iOS devices, set the audioSession category, mode, and options:
        let session = AVAudioSession.sharedInstance()  // Get the singleton instance of an AVAudioSession.
        do 
            if(filePlayEnabled) 
                // This is required by iOS to prevent output audio from going only to the iPhone's rear speaker.
                try session.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.default, options: [.defaultToSpeaker])
            
            else 
                try session.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.default, options: [])
            
         catch  print("Failed to set audioSession category.") 
    #endif

再次感谢罗伯。

【讨论】:

以上是关于iOS 是不是会降低使用麦克风的应用程序的扬声器音量?的主要内容,如果未能解决你的问题,请参考以下文章

C#自适应声音消除[关闭]

移植到 iOS 7 的应用程序现在请求麦克风访问权限

如何通过 MATLAB DSP System Toolbox 降低音频延迟?

iOS中的麦克风输入到扬声器输出?

如何检查麦克风和扬声器是不是来自同一声卡?

屏幕录制时没有声音是怎么回事