【问题标题】:AVAudioSession - How to switch between speaker and headphones outputAVAudioSession - 如何在扬声器和耳机输出之间切换
【发布时间】:2018-09-18 16:09:31
【问题描述】:

我正在尝试在通话期间模仿电话应用中的行为。您可以轻松地在扬声器或耳机之间切换输出源。 我知道我可以通过调用连接耳机时强制扬声器作为输出:

try! audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)  
try! audioSession.overrideOutputAudioPort(.speaker)  

但是,当我这样做时,我看不到任何方法来检测耳机是否仍连接到设备。

我最初认为 AVAudioSession 上的 outputDataSources 会返回所有可能的输出,但它总是返回 nil。

我有什么遗漏

【问题讨论】:

  • 查看最新答案更新谢谢

标签: ios avfoundation avaudiosession


【解决方案1】:

您需要更改 outputDataSources,就像您覆盖它时一样,

现在它只包含.Speaker 选项

在文档中您可以找到解决方案,

如果您的应用使用 playAndRecord 类别,则使用 AVAudioSession.PortOverride.speaker 选项调用此方法会导致音频被路由到内置扬声器和麦克风,而不管其他设置如何。此更改仅在当前路由更改或您使用 AVAudioSession.PortOverride.none 选项再次调用此方法之前保持有效。

因此音频被路由到内置扬声器,此更改仅在当前路由更改或您再次使用.noneOption 调用此方法之前保持有效。

除非将配件插入耳机插孔(这会激活物理开关以将声音引导至耳机),否则无法强制将声音引导至耳机。

因此,当您想切换回耳机时,这应该可以。 如果没有连接耳机,则将输出设备切换到设备顶部的小扬声器输出,而不是大扬声器。

let session: AVAudioSession = AVAudioSession.sharedInstance()
        do {
            try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
            try session.overrideOutputAudioPort(AVAudioSession.PortOverride.none)
            try session.setActive(true)
        } catch {
            print("Couldn't override output audio port")
        }

阅读此 AVAdioSession/OverrideOutputAudioPort Here

您可以检查耳机是否连接添加此扩展,

    extension AVAudioSession {

    static var isHeadphonesConnected: Bool {
        return sharedInstance().isHeadphonesConnected
    }

    var isHeadphonesConnected: Bool {
        return !currentRoute.outputs.filter { $0.isHeadphones }.isEmpty
    }

}

extension AVAudioSessionPortDescription {
    var isHeadphones: Bool {
        return portType == AVAudioSessionPortHeadphones
    }
}

并且只需使用这行代码

session.isHeadphonesConnected

【讨论】:

  • 谢谢托比。那么当我将类别覆盖为.speaker 时,有什么方法可以检查耳机是否仍然插入?
  • 你为什么要检查?他们的操作系统会自动为您执行此操作,并检测上面的代码是否将音频从扬声器传输到耳机,如果头戴式耳机顺利进行,如果不是没有问题,尽管您可以使用该代码然后检查输出源是否是耳机,但可以解决一些问题,例如这个
  • 所以步骤是,使用该代码更改输出,然后通过检查输出源来检查是否有耳机,因为这会将源更改为耳机或内置电话扬声器
  • 如果为您连接了耳机,请编辑我的答案以添加@msmialko
  • 你可以像这样简单地检查耳机是否连接,然后做任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多