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



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

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

当我注释掉这一行时,iPhone扬声器级别(用于文件播放模式)是正常的。但当我取消评论时,iPhone扬声器的音量几乎听不见。甚至当我将这行括在条件if(micEnabled){}结构中时,声级一开始是好的;但一旦我选择麦克风,然后切换回文件播放,音量又变小了。

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

我的源代码可在这里。所有的音频代码都在MuVis/Shared/audiomemanager .swift类中。

谁能帮助我得到文件播放模式的工作与全音量在我的iPhone -同时也允许用户选择麦克风输入模式的选项?

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

作为一个只使用macOS的开发者,我忽略了AVAudioSession(因为它会导致macOS上的编译错误)。当我将我的MuVis应用程序从macos转换为多平台时,我只是用适当的多平台设置启动一个新的Xcode项目,然后将我现有的代码粘贴到shared文件夹中。在清理了一些错误(主要是对NSObject的调用)之后,它神奇地在所有苹果平台上工作-除了我的问题中描述的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
再次感谢你,Rob。

最新更新