gpt4 book ai didi

ios - AVAudioSession - 如何在扬声器和耳机输出之间切换

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:28:36 24 4
gpt4 key购买 nike

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

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

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

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

有什么我想念的吗

最佳答案

您需要更改 outputDataSources,因为当您覆盖它时,

现在它只包含.Speaker 选项

在文档中你可以找到解决这个问题的方法,

If your app uses the playAndRecord category, calling this method with the AVAudioSession.PortOverride.speaker option causes audio to be routed to the built-in speaker and microphone regardless of other settings. This change remains in effect only until the current route changes or you call this method again with the AVAudioSession.PortOverride.none option.

因此音频被路由到内置扬声器,此更改仅在当前路由更改或您使用 .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

关于ios - AVAudioSession - 如何在扬声器和耳机输出之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52390659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com