如何在录制视频时添加音频输入到AVCaptureSession,且不会中断视频预览?

4
我有一个问题需要解决:我有一个带预览层的AVCaptureSession,我还想在用户点击按钮时提供触觉反馈。如果我向我的AVCaptureSession添加audioInput,则无法产生触觉反馈。我尝试在开始录制之前添加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个回答

4
我感到非常愚蠢,因为没有在短时间内找到解决方案。所以,解决方案是创建两个AVCaptureSession - 一个用于视频捕获(会话1),另一个用于音频捕获(会话2)。会话1始终运行,这样它就可以提供预览层。只有在录制开始时才启动会话2,并立即停止。两个会话都有相应的AVCaptureOutput,它们都将数据缓冲区输出到同一个委托,该委托反过来使用AVAssetWriter将这些缓冲区写入视频文件。就是这样。

1
如果您有代码示例,请在答案中更新。 - Suresh Velusamy
请分享如何实现音频捕获会话的示例代码。因为我对如何进行音频捕获会话很感兴趣。 - Asif Bilal
我就是这样做的。在文件顶部创建两个capturesession变量,一个用于音频,一个用于相机。在viewload中设置两个capturesession的输入和输出,但只启动相机会话,在录制视频事件上启动音频会话。完成后停止会话。编辑:这也是ios 14导航栏始终只有一个绿点的方法。只有一个会话始终给了我一个绿色,然后变成黄色,再变成绿色。 - blackops

0

我按照建议创建了两个会话,一个用于视频流,另一个用于带音频的录制。但是,如果使用1080p相机分辨率开始录制,则我的应用程序无法接收相机帧。

有什么建议可以帮助我解决这个问题吗?

提前感谢。 Sharif。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接