[英]AVAudioSession - How to switch between speaker and headphones output
我試圖在通話期間模仿電話應用程序中的行為。 您可以輕松地在揚聲器或耳機之間切換輸出源。 我知道我可以在通過調用連接耳機時強制揚聲器作為輸出:
try! audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try! audioSession.overrideOutputAudioPort(.speaker)
但是,當我這樣做時,我看不到任何方法來檢測耳機是否仍連接到設備。
我最初認為outputDataSources
上的 outputDataSources 會返回所有可能的輸出,但它總是返回 nil。
有什么我想念的嗎
您需要更改 outputDataSources,因為當您覆蓋它時,
現在它只包含.Speaker
選項
在文檔中,您可以找到解決方案,
如果您的應用程序使用 playAndRecord 類別,則使用 AVAudioSession.PortOverride.speaker 選項調用此方法會導致音頻路由到內置揚聲器和麥克風,而不管其他設置如何。 此更改僅在當前路由更改或您使用 AVAudioSession.PortOverride.none 選項再次調用此方法之前保持有效。
因此,音頻被路由到內置揚聲器,此更改僅在當前路由更改或您再次使用.noneOption
調用此方法之前保持.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 的信息。
您可以檢查耳機是否已連接添加此擴展名,
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.