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

How to add audio input to AVCaptureSession only when recording without interrupting video preview?

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

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

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: { ([=10=] as? AVCaptureDeviceInput)?.device.deviceType == .builtInMicrophone }) as? AVCaptureDeviceInput {
            self.captureSession.beginConfiguration()
            self.captureSession.removeInput(audioInput)
            self.captureSession.commitConfiguration()
        }
    }
}

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

我已经按照此处的建议创建了 2 个会话,一个用于视频流,另一个用于录制音频。但是如果我的应用程序以 1080p 相机分辨率开始录制,则它不会接收到相机帧。

对我有任何解决这个问题的建议。

提前致谢。 谢里夫