我正在努力解决一个问题:我有带有预览层的 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 s - 一个用于视频捕获( session 1),另一个用于音频捕获( session 2)。 Session 1 一直在运行,因此它为我们提供了预览层。 session 2 仅在录制开始时启动,然后立即停止。两个 session 都有相应的 AVCaptureOutput ,并且它们都将数据缓冲区输出到同一个委托(delegate),然后使用 AVAssetWriter 将这些缓冲区写入视频文件。就这样。

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

10-13 07:43