我正在努力解决一个问题:我有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()
}
}
}
答案 0 :(得分:2)
我觉得愚蠢到不能在短时间内弄清楚解决方案。因此,解决方案是创建两个AVCaptureSession
s - 一个用于视频捕获(会话1),一个用于音频捕获(会话2)。会话1始终在运行,因此它为我们提供了预览图层。会话2仅在录制开始时启动,并在之后立即停止。两个会话都有相应的AVCaptureOutput
,并且它们都将数据缓冲区输出到同一个委托,然后使用AVAssetWriter
将这些缓冲区写入视频文件。这就是全部。
答案 1 :(得分:0)
我已按照此处的建议创建了2个会话,一个用于视频流,另一个用于音频录音。但是,如果我的应用程序开始以1080p摄像机分辨率进行录制,则不会收到Camera帧。
任何对我的建议都可以解决。
预先感谢。 谢里夫。