gpt4 book ai didi

swift - 如何在不中断视频预览的情况下仅在录制时将音频输入添加到 AVCaptureSession?

转载 作者:搜寻专家 更新时间:2023-11-01 07:10:14 24 4
gpt4 key购买 nike

我正在努力解决一个问题:我有带预览层的 AVCaptureSession,我还想在用户点击按钮时提供触觉反馈。如果我将 audioInput 添加到我的 AVCaptureSession,那么我根本无法产生触觉反馈。我试图在开始记录之前添加 audioInput 并在停止后立即删除,但修改捕获 session 配置(我在串行队列中所做的)导致视频预览打嗝(它被中断了几分之一秒)。我仍然不知道 Snapchat 和 Instagram 是如何做到这一点的。我的猜测之一是他们以某种方式配置了 AVAudioSession,但我无法弄清楚。

我的捕获 session 初始化非常一般,所以我不会粘贴它(这里值得注意的是我有 captureSession.automaticallyConfiguresApplicationAudioSession = false 行并且共享 AVAudioSession 被修改为 AVAudioSession.sharedInstance ().setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeVideoRecording, options: [.mixWithOthers])), 但我会发布我尝试切换音频输入的尝试:

func addAudioInput() {
self.sessionQueue.async { [unowned self] in
self.captureSession.beginConfiguration()
let microphone = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio)
if let audioInput = try? AVCaptureDeviceInput(device: microphone), self.captureSession.canAddInput(audioInput) {
self.captureSession.addInput(audioInput)
}
self.captureSession.commitConfiguration()
}
}

func removeAudioInput() {
self.sessionQueue.async { [unowned self] in
if let audioInput = self.captureSession.inputs.first(where: { ($0 as? AVCaptureDeviceInput)?.device.deviceType == .builtInMicrophone }) as? AVCaptureDeviceInput {
self.captureSession.beginConfiguration()
self.captureSession.removeInput(audioInput)
self.captureSession.commitConfiguration()
}
}
}

最佳答案

我觉得自己够笨了,没能在短时间内找出解决方案。因此,解决方案是创建两个 AVCaptureSession - 一个用于视频捕获( session 1),一个用于音频捕获( session 2)。 session 1 始终运行,因此它为我们提供了预览层。 session 2 仅在录制开始后立即停止时开始。两个 session 都有相应的 AVCaptureOutput,并且它们都将数据缓冲区输出到同一个委托(delegate),后者又使用 AVAssetWriter 将这些缓冲区写入视频文件。就这样。

关于swift - 如何在不中断视频预览的情况下仅在录制时将音频输入添加到 AVCaptureSession?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45427426/

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