簡體   English   中英

AVAudioSession - 如何在揚聲器和耳機輸出之間切換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM