【问题标题】:How to add audio input to AVCaptureSession only when recording without interrupting video preview?如何在不中断视频预览的情况下仅在录制时向 AVCaptureSession 添加音频输入?
【发布时间】:2017-08-01 01:06:09
【问题描述】:

我正在努力解决一个问题:我有带有预览层的 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()
        }
    }
}

【问题讨论】:

    标签: swift camera avfoundation avcapturesession avaudiosession


    【解决方案1】:

    我觉得自己很愚蠢,无法在短时间内找出解决方案。因此,解决方案是创建两个AVCaptureSessions - 一个用于视频捕获(会话 1),一个用于音频捕获(会话 2)。会话 1 始终在运行,因此它为我们提供了预览层。会话 2 仅在录制开始时开始,然后立即停止。两个会话都有相应的AVCaptureOutputs,并且它们都将数据缓冲区输出到同一个委托,而后者又使用AVAssetWriter 将这些缓冲区写入视频文件。就是这样。

    【讨论】:

    • 如果您有代码示例,请在答案中更新伙计
    • 请分享示例代码如何做到这一点。因为我只是对如何制作音频捕获会话有点好奇。
    • 我就是这么做的。在文件顶部创建两个 capturesession 变量,一个用于音频,一个用于相机。在视图加载设置中,相应地捕获会话输入和输出,但仅启动相机会话,在录制视频事件时,启动音频会话。完成后停止会话。编辑:这也是你在 ios 14 的导航栏中总是只有一个绿点的方式。有一个会话总是给我一个绿色,然后变成黄色,然后回到绿色。
    【解决方案2】:

    按照此处的建议,我创建了 2 个会话,一个用于视频流,另一个用于录制音频。但是,如果我的应用程序开始以 1080p 相机分辨率录制,则它不会接收到相机帧。

    对我的任何建议,以解决此问题。

    提前致谢。 谢里夫。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2012-02-28
      • 2015-04-20
      • 1970-01-01
      相关资源
      最近更新 更多