2017-08-01 21 views
0

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

我捕获会话初始化是相当普遍的,所以我不会粘贴(这里值得注意的是,我有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() 
     } 
    } 
} 

回答

1

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

+0

如果你有代码示例请更新答案哥们 –

相关问题