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

和卡尔巴耶夫

我正在为一个问题而苦苦挣扎:我有带预览层的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()
        }
    }
}
和卡尔巴耶夫

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不中断编号的情况下将代码添加到数字列表的项目中?

在不中断背景媒体播放的情况下录制音频

如何在不中断DKIM签名的情况下将Date:标头添加到已接收的电子邮件中

如何在不中断程序的情况下使用用户输入停止 while 循环?

如何在不中断for循环的情况下引发异常?

如何在不中断Kinect的情况下运行方法

WebRTC:在SDP中没有捆绑线的情况下将视频添加到音频呼叫

如何在不添加子列表的情况下将键值对添加到列表?

如何在不使用按钮和面板的情况下将ActionListener添加到JFrame?

如何在没有HttpClientFactory的情况下将多个HttpMessageHandler添加到HttpClient

如何在没有IAppBuilder的情况下将中间件添加到Owin

如何在没有发送者的情况下将Target添加到UIButton

如何在不跟踪索引的情况下将元素添加到列表?

如何在没有提交的情况下将项目从 Github 添加到 Github?

如何在不停止JVM的情况下将Javaagent添加到JVM?

如何在不更改其他行的情况下将 TableRow 添加到 TableLayout

如何在不擦除数据的情况下将存储添加到VMWare vSphere

如何在不使用for循环的情况下将数据从ByteArray添加到链表?

如何在不使用for循环的情况下多次将单个项目添加到arraylist

如何在不使用xml的情况下将进度条添加到画布?

如何在不使用环境变量的情况下将代理添加到Praw?

如何在不使用 estadd 的情况下将文本添加到 esttab 表的底部

如何在不弹出的情况下将CopyWebpackPlugin添加到create-react-app?

如何在不加载整个文件的情况下将标题行添加到 CSV?

如何在不更改基类的情况下将行为添加到类的实例

如何在没有多余空格的情况下将mailto添加到句子?

如何在不绘制原始数据的情况下将图例添加到ggplot?

如何在不替换使用 NodeJS 的情况下将数据添加到 Firebase?

如何在不替换旧文本的情况下将文本添加到TextView?