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

标签 swift camera avfoundation avcapturesession avaudiosession

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

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

相关文章:

ios - 如何让 AVPlayer 立即出现而不是在视频结束后出现?

ios - 一秒钟后如何快速更改字符串?

swift - 从字典中删除我选择的那一天之前的所有日期

java - Android 相机 SurfaceView 在上面放置 ImageView 覆盖时消失

来自相机的 android 位图只是缩略图大小?

macos - 在Mac上处理音频I/O设备连接和分离的正确方法

ios - 如何使用 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 同时写入视频和音频?

ios - 调度组通知不起作用

swift - RxSwift - 数组合并、排序、删除重复项

java - 如何在 LibGDX 中左右移动相机