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

时间:2017-08-01 01:06:10

标签: swift camera avfoundation avcapturesession avaudiosession

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

我的捕获会话初始化非常通用所以我不会粘贴它(这里值得注意的是我有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()
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我觉得愚蠢到不能在短时间内弄清楚解决方案。因此,解决方案是创建两个AVCaptureSession s - 一个用于视频捕获(会话1),一个用于音频捕获(会话2)。会话1始终在运行,因此它为我们提供了预览图层。会话2仅在录制开始时启动,并在之后立即停止。两个会话都有相应的AVCaptureOutput,并且它们都将数据缓冲区输出到同一个委托,然后使用AVAssetWriter将这些缓冲区写入视频文件。这就是全部。

答案 1 :(得分:0)

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

任何对我的建议都可以解决。

预先感谢。 谢里夫。

相关问题