我正在为一个问题而苦苦挣扎:我有带预览层的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()
}
}
}
我感到愚蠢到无法在短时间内解决问题。因此,解决方案是创建两个AVCaptureSession
s-一个用于视频捕获(会话1),一个用于音频捕获(会话2)。会话1始终在运行,因此它为我们提供了预览层。会话2仅在录制开始时启动,并在录制之后立即停止。两个会话都有对应AVCaptureOutput
的,并且两个会话都将数据缓冲区输出到同一委托人,该委托人又将AVAssetWriter
这些缓冲区写入视频文件。就这样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句