我已基于在网上找到的几个示例编写了以下代码,以便从macOS上的内置摄像头捕获视频数据。设置AVCaptureSession
时不会引发致命错误,但不会调用该委托,并且在我调用captureSession.startRunning()
时会立即记录一些明显的错误。
到目前为止,我已经尝试对我的代码进行一些小的调整(例如,从输出中删除videoSettings
或从会话中删除sessionPreset
),以及检查测试所用的系统偏好设置应用具有摄像头访问权限。但是,日志仍然保留,并且不会调用该委托。
CameraInput类(包括委托):
final class CameraInput: NSObject {
private lazy var sampleBufferDelegateQueue = DispatchQueue(label: "CameraInput")
private lazy var captureSession: AVCaptureSession = {
let session = AVCaptureSession()
session.sessionPreset = .hd1280x720
let device = AVCaptureDevice.default(for: .video)!
let input = try! AVCaptureDeviceInput(device: device)
session.addInput(input)
let output = AVCaptureVideoDataOutput()
output.videoSettings = [
kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA,
kCVPixelBufferMetalCompatibilityKey as String: true
]
output.alwaysDiscardsLateVideoFrames = true
output.setSampleBufferDelegate(self, queue: self.sampleBufferDelegateQueue)
session.addOutput(output)
return session
}()
}
extension CameraInput: CVInput {
func start() {
guard !self.captureSession.isRunning else {
return
}
self.captureSession.startRunning()
}
func stop() {
guard self.captureSession.isRunning else {
return
}
self.captureSession.stopRunning()
}
}
extension CameraInput: AVCaptureVideoDataOutputSampleBufferDelegate {
private func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
// Handle captured frame
}
}
ViewController(新可可应用程序中的默认ViewController):
class ViewController: NSViewController {
lazy var cameraInput = CameraInput()
override func viewDidLoad() {
super.viewDidLoad()
self.cameraInput.start()
}
}
记录的信息:
2019-01-02 16:27:15.821858+0100 TestApp[14182:1492243] [] CMIO_Unit_ScopeElement.h:200:SafeGetElement Throwing err: -67454
2019-01-02 16:27:15.823248+0100 TestApp[14182:1492243] [] CMIOUnitFigBaseObjectImpl.c:246:CMIOUnitCreateFromDescription Invalid paramater
2019-01-02 16:27:15.840190+0100 TestApp[14182:1492243] [] CMIO_Unit_Input_Device.cpp:244:GetPropertyInfo CMIOUInputFromProcs::GetPropertyInfo() failed for id 102, Error: -67456
在此方面的任何帮助都将不胜感激!另外,如果需要更多信息,请告知我。
编辑 碰上this question之后,我已经排除了有关沙盒的问题。
答案 0 :(得分:2)
您需要从您的private
方法中删除关键字captureOutput:didOutput
。
我猜想它足以改变签名,从而不会调用您的方法。
答案 1 :(得分:0)
您的代码似乎没问题。尝试
AVCaptureVideoDataOutputSampleBufferDelegate
添加到应用程序委托声明中self.captureSession.startRunning()
添加到AppDelegate的applicationDidFinishLaunching
函数中NSCameraUsageDescription
(macOS 10.14及更高版本)我刚刚测试过,重复调用了委托函数 。 我在macOS 10.14 / XCode 10上看到了提到的日志输出(在macOS 10.13 / Xcode 9上没有显示),但是它不会阻止捕获。
因此,问题不在给出的代码中。确保所有对象均按预期实际创建,确保捕获会话设置运行,并且没有任何对象(尤其是输出委托)过早释放。
答案 2 :(得分:0)
我遇到了这个确切的错误。标有答案的答案帮助我正确地开始了工作,但我觉得我的问题分歧很大,值得提出另一个答案
我的代码在不工作时是这样的。
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!)
那是过去的样子。我使用Xcode自动完成功能来获取当前版本。
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
所以故事的寓意... Conversion to Swift <insert version> is Available
并不总是完美的。