【问题标题】:App doesn't route audio to headphones (initially)应用程序不会将音频路由到耳机(最初)
【发布时间】:2019-10-25 15:26:14
【问题描述】:

我有一个使用 Sinch SDK 和 CallKit 实现的 VOIP 应用程序。一切正常,除了设备插入耳机时。在后一种情况下,当通话开始时,音频仍然通过设备的主扬声器路由。如果我在通话期间拔下耳机并重新插入,音频就会正确路由到耳机。

我所做的只是

func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
    guard let c = self.currentCall else {
        action.fail()
        return
    }

    c.answer()

    self.communicationClient.audioController().configureAudioSessionForCallKitCall()
    action.fulfill()
}

这不应该由操作系统自动处理吗?

【问题讨论】:

  • “主扬声器”是指扬声器还是接收器(即手机屏幕顶部的扬声器)?此外,您能否展示一下如何配置音频会话?
  • 我的意思是扬声器。我自己不配置音频会话。我正在从 Sinch SDK 调用方法“configureAudioSessionForCallKitCall”:/

标签: ios swift sinch callkit


【解决方案1】:

Sinch SDK 似乎覆盖了输出音频端口。尝试在配置音频会话后立即运行此代码:

do {
    try AVAudioSession.sharedInstance().overrideOutputAudioPort(.none)
} catch {
    print("OverrideOutputAudioPort failed: \(error)")
}

如果不行,可以尝试自己配置音频会话,尽量不要依赖 Sinch SDK。将 configureAudioSessionForCallKitCall 调用替换为以下内容:

let session = AVAudioSession.sharedInstance()
do {
    try session.setCategory(
        .playAndRecord,
        mode: .voiceChat,
        options: [.allowBluetooth, .allowBluetoothA2DP])
    try session.setActive(true)
} catch {
    print("Unable to activate audio session: \(error)")
}

【讨论】:

  • 出于某种奇怪的原因,如果我注释掉对“configureAudioSessionForCallKitCall”的调用并且什么都不做,它会起作用。这有意义吗?
  • 是的,正如我所说:它们可能会覆盖输出端口 (overrideOutputAudioPort(.speaker))。因此,如果您出于某种原因需要致电configureAudioSessionForCallKitCall,请在此之后立即致电overrideOutputAudioPort(.none)。否则,我建议您自行配置音频会话 - 正如您在答案的第二部分中看到的那样 - 以确保其配置正确。以便音频会话行为更可预测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2012-12-22
  • 2016-01-30
  • 1970-01-01
相关资源
最近更新 更多