![](/img/trans.png)
[英]AVCaptureSession, AVCaptureAudioDataOutput and background Music
[英]iOS Camera: `AVCaptureAudioDataOutput` activate audio session on the fly, avoid background music stutter
我使用 AVFoundation 創建了一個攝像頭,它能夠使用AVCaptureVideoDataOutput
和AVCaptureAudioDataOutput
錄制視頻和音頻。 我創建了我的捕獲 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.