AVCaptureSession 不会在不关闭应用程序的情况下释放 AVCaptureDevice 以便在 DeckLink SDK 中使用
AVCaptureSession is not releasing AVCaptureDevice without closing application for usage in DeckLink SDK
当使用 AVCaptureSession
连接 AVCaptureDevice
时,设备会被应用程序锁定并且无法释放。设备真正释放的唯一方法是在重新启动应用程序后。
我们正在使用 AVCaptureSession
来预览相机和音频电平表。但是一旦开始实际捕获,我们可能需要切换到替代捕获 SDK(在本例中为 DeckLink SDK)。设备是如何被 AVFoundation
锁定的,我们似乎无法以任何方式释放它……一旦我们从 AVCaptureSession
上调用 AVCaptureSession.addInput
,一切都会发生变化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
在 AVFoundation
.
中使用后,我们如何无法在 DeckLink SDK 中识别设备
任何想法都会很棒,因为清理变量或将变量设置为 nil
似乎没有任何作用...
我们选择实施 Blackmagic 的桌面视频 SDK,并使用它从 Blackmagic 设备进行所有捕获。这解决了使用 Blackmagic Mini Recorder(例如:音频同步)捕捉时的更多问题而Blackmagic官方也从未回答过“你支持AVFoundation”这个问题。因此,为了使其正常工作,我会推荐桌面视频 SDK,可以从他们网站的支持下下载。
https://www.blackmagicdesign.com/support/
还要确保您永远不会将视频设备加载到您的 AVFoundation 工作流程中。它会卡住并握住它。因此,首先检查它是否是 Blackmagic,如果不是,则继续 AVFoundation。
当使用 AVCaptureSession
连接 AVCaptureDevice
时,设备会被应用程序锁定并且无法释放。设备真正释放的唯一方法是在重新启动应用程序后。
我们正在使用 AVCaptureSession
来预览相机和音频电平表。但是一旦开始实际捕获,我们可能需要切换到替代捕获 SDK(在本例中为 DeckLink SDK)。设备是如何被 AVFoundation
锁定的,我们似乎无法以任何方式释放它……一旦我们从 AVCaptureSession
上调用 AVCaptureSession.addInput
,一切都会发生变化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
在 AVFoundation
.
任何想法都会很棒,因为清理变量或将变量设置为 nil
似乎没有任何作用...
我们选择实施 Blackmagic 的桌面视频 SDK,并使用它从 Blackmagic 设备进行所有捕获。这解决了使用 Blackmagic Mini Recorder(例如:音频同步)捕捉时的更多问题而Blackmagic官方也从未回答过“你支持AVFoundation”这个问题。因此,为了使其正常工作,我会推荐桌面视频 SDK,可以从他们网站的支持下下载。
https://www.blackmagicdesign.com/support/
还要确保您永远不会将视频设备加载到您的 AVFoundation 工作流程中。它会卡住并握住它。因此,首先检查它是否是 Blackmagic,如果不是,则继续 AVFoundation。