代码之家  ›  专栏  ›  技术社区  ›  Jory de Kort

AVCaptureSession在未关闭应用程序以便在DeckLink SDK中使用的情况下不会释放AVCaptureDevice

  •  2
  • Jory de Kort  · 技术社区  · 7 年前

    使用时 AVCaptureSession 连接 AVCaptureDevice 设备get已被应用程序锁定,无法释放。设备真正释放的唯一方法是重启应用程序。

    我们正在使用 AVCaptureSession 用于预览摄像头和音频音量表。但一旦开始实际捕获,我们可能需要切换到另一个捕获SDK(在本例中 DeckLink SDK )。设备的锁定方式 AVFoundation 我们似乎无法以任何方式释放它。。。。我们一打电话,一切都会变糟 AVCaptureSession.addInput AVCaptureSession AVCaptureDevice 。只需迭代输入并使用 AVCaptureSession.removeInput 似乎不起作用。

    我们将会话设置为:

    do {
        try self.selectedVideoDevice.lockForConfiguration()
        try self.selectedAudioDevice?.lockForConfiguration()
    
        self.cameraSession = AVCaptureSession()
    
        self.cameraSession?.beginConfiguration()
        self.cameraSession?.sessionPreset = AVCaptureSession.Preset.high
    
        // Add some outputs... not relevant for the issue at hand?!
    
        // Add audio input
        if self.selectedAudioDevice != nil {
            let deviceInputAudio = try AVCaptureDeviceInput(device: self.selectedAudioDevice!)
            if self.cameraSession?.canAddInput(deviceInputAudio) ?? false {
                self.cameraSession?.addInput(deviceInputAudio)
            }
        }
    
        // Add video input
        let deviceInputVideo = try AVCaptureDeviceInput(device: self.selectedVideoDevice)
    
        if self.cameraSession?.canAddInput(deviceInputVideo) ?? false {
            self.cameraSession?.addInput(deviceInputVideo)
        }
    
        self.cameraSession?.commitConfiguration()
        self.cameraSession?.startRunning()
    
        self.selectedVideoDevice.unlockForConfiguration()
        self.selectedAudioDevice?.unlockForConfiguration()
    
    } catch {
    
    }
    

    试着用这样的方式发布。。。众多尝试之一。。。

    self.cameraSession?.stopRunning()
    
    for output in self.cameraSession?.outputs ?? [] {
        self.cameraSession?.removeOutput(output)
    }
    
    for input in self.cameraSession?.inputs ?? [] {
        self.cameraSession?.removeInput(input)
    }
    
    self.cameraSession = nil
    

    在中使用后,我们无法在DeckLink SDK中识别设备 AVFoundation公司

    任何想法都可以很好地清理或设置变量 nil 似乎什么都没做。。。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jory de Kort    3 年前

    我们选择从Blackmagic实现桌面视频SDK,并使用它从Blackmagic设备进行所有捕获。这解决了使用Blackmagic Mini Recorder(例如:音频同步)进行捕获时出现的更多问题。虽然AVFoundation确实与Blackmagic配合使用,但效果并不理想。黑魔法官方从未回答过“你支持AVFoundation吗”这个问题。因此,为了让它发挥作用,我建议使用桌面视频SDK,可以在支持下从他们的网站下载。

    https://www.blackmagicdesign.com/support/

    此外,请确保从未将视频设备加载到AVFoundation工作流中。它会卡住并保持住。因此,首先检查它是否是黑魔法,如果不是,则继续AVFoundation。