Xcode 我希望抓取AVCaptureConnection音频,并在需要时启用/禁用它,而无需添加/删除输入

Xcode 我希望抓取AVCaptureConnection音频,并在需要时启用/禁用它,而无需添加/删除输入,xcode,avcapturesession,Xcode,Avcapturesession,标题说明了一切。不知道该怎么处理滞后。当我说lag时,似乎当您尝试更改连接的状态connection.enabled状态时,它将冻结avcapturesession以进行更改。不管怎么说,关于这个?下面是我目前用来获取音频连接和更改状态的代码。如果我在开始录制之前运行此功能,它将冻结一秒钟,然后在录制完成后将其关闭,但这会增加另一秒钟的冻结时间。这不是一个很好的用户体验 func EnableDisableAudioDevice(enableAudio :Bool) { var audi

标题说明了一切。不知道该怎么处理滞后。当我说lag时,似乎当您尝试更改连接的状态connection.enabled状态时,它将冻结avcapturesession以进行更改。不管怎么说,关于这个?下面是我目前用来获取音频连接和更改状态的代码。如果我在开始录制之前运行此功能,它将冻结一秒钟,然后在录制完成后将其关闭,但这会增加另一秒钟的冻结时间。这不是一个很好的用户体验

func EnableDisableAudioDevice(enableAudio :Bool)
{
    var audioInput :AVCaptureDeviceInput?
    if (enableAudio) {
        for input in appDel.captureSession.inputs as! [AVCaptureDeviceInput]
        {
            if input.device.hasMediaType(AVMediaTypeAudio)
            {
                audioInput = input
                break
            }
        }
        if (audioInput != nil) {
            for conn in audioInput!.ports as! [AVCaptureInputPort]
            {
                if conn.mediaType == AVMediaTypeAudio
                {
                    conn.enabled = true
                    break
                }
            }
        }
    }
    else {
        for input in appDel.captureSession.inputs as! [AVCaptureDeviceInput]
        {
            if input.device.hasMediaType(AVMediaTypeAudio)
            {
                audioInput = input
                break
            }
        }
        if (audioInput != nil) {
            for conn in audioInput!.ports as! [AVCaptureInputPort]
            {
                if conn.mediaType == AVMediaTypeAudio
                {
                    conn.enabled = false
                    break
                }
            }
        }
    }
}
更新:

我发现添加音频输入似乎不是播放录音的原因,而是因为我的AVCaptureMovieFileOut。如果您在录制之前将该输出添加到捕获会话中,然后添加音频输入,则会显示您正在录制。不确定是故意的还是一个bug。在试图找到一个解决方案来解释为什么在添加输出时会锁定应用程序时仍然存在问题


谢谢

我认为这是不可能的,因为capturesession会自动在主线程上运行,最好在后台线程中执行此操作,这样会话就不会冻结,然后在音频状态更改后执行我需要的操作。我知道有一种解决方法,正如我在snapchat中看到的那样,我试过dispatch_async,还有其他方法使用后台线程吗?我还没有弄明白这一点。