簡體   English   中英

iOS 攝像頭:`AVCaptureAudioDataOutput` 激活音頻 session 即時,避免背景音樂口吃

[英]iOS Camera: `AVCaptureAudioDataOutput` activate audio session on the fly, avoid background music stutter

我使用 AVFoundation 創建了一個攝像頭,它能夠使用AVCaptureVideoDataOutputAVCaptureAudioDataOutput錄制視頻和音頻。 我創建了我的捕獲 session,附加所有輸入以及視頻和音頻數據輸出,然后相機處於空閑狀態。 用戶現在可以開始視頻錄制。

問題

這樣做的問題是,在我開始捕獲 session ( captureSession.startRunning() ) 后,背景音樂就會斷斷續續。 我認為這是因為一旦捕獲 session 開始運行, AVCaptureAudioDataOutput在內部激活 AVAudioSession ( AVAudioSession.setActive(...) ),我不希望它這樣做。 我希望它處於空閑狀態(並且不提供任何音頻 output 緩沖區),直到我明確激活音頻 Session(一旦用戶開始錄制)。

這真的很煩人,因為相機是我們應用程序的開始屏幕,每次用戶打開或關閉應用程序時,他的音樂都會斷斷續續。

我知道這在某種程度上是可能的,因為 Snapchat 就是這樣工作的——你打開應用程序,背景音頻會繼續流暢地播放。 開始錄制后,背景音樂會出現一點點卡頓,但相機運行流暢,一旦卡頓結束就開始錄制。

我的代碼:

func configureSession() {

    captureSession.beginConfiguration()

    // Video, Photo and Audio Inputs
    ...

    // Video Output
    ...

    // Audio Output
    audioOutput = AVCaptureAudioDataOutput()
    guard captureSession.canAddOutput(audioOutput!) else {
      throw CameraError.parameter(.unsupportedOutput(outputDescriptor: "audio-output"))
    }
    audioOutput!.setSampleBufferDelegate(self, queue: audioQueue)
    captureSession.addOutput(audioOutput!)

    try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playAndRecord,
                                                    options: [.mixWithOthers,
                                                              .allowBluetoothA2DP,
                                                              .defaultToSpeaker,
                                                              .allowAirPlay])

    captureSession.commitConfiguration()
}

我試過的

延遲配置AVAudioSession.sharedInstance()

我嘗試首先使用AVAudioSession.sharedInstance類別配置AVAudioSession.Category.playback ,然后在我想開始錄制音頻時切換到.playAndRecord

這不起作用,並且在使用錯誤代碼-10851啟動相機后立即調用AVCaptureSessionRuntimeError事件,這意味着kAudioUnitErr_InvalidPropertyValue 我認為這意味着AVCaptureAudioDataOutput不允許從音頻 Session 錄制,但我現在不想這樣做 - 它應該只是空閑。

延遲添加AVCaptureAudioDataOutput output

我試圖在開始時不添加音頻 output ( AVCaptureAudioDataOutput ),並且僅在用戶開始錄制時“按需”添加它,而這對於背景音樂效果很好(開始時沒有口吃,只有短暫的口吃一次用戶開始錄制,正是我想要的),它使預覽凍結了很短的時間(因為 Capture Session 正在通過beginConfiguration + audio output 添加 + commitConfiguration重新配置)

有誰知道如何實現我在這里嘗試做的事情 - 或者 Snapchat 是如何做到的? 任何幫助表示贊賞,謝謝!

終於想通了。 我只是專門為我與主捕獲會話的masterClock同步的音頻輸入/輸出創建了一個單獨的AVCaptureSession 然后我可以即時啟動/停止輔助捕獲 session(開始錄制前不久)

.mixWithOthers看起來是避免中斷的正確做法,但默認的AVCaptureSession將為您配置AVAudioSession ,因此請設置

captureSession.automaticallyConfiguresApplicationAudioSession = false

阻止它替換您的設置。

該屬性的文檔告訴我們AVCaptureSession不僅僅是設置.playAndRecord類別,這對您的用例可能很重要:

接收器確保應用程序的音頻 session 設置為 PlayAndRecord 類別,並選擇適當的麥克風和極性模式以匹配正在使用的攝像機

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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