swift - 如何在 macOS 中使用 AVFoundation 采集视频数据?

标签 swift macos avfoundation

为了从 macOS 上的内置摄像头捕获视频数据,我根据网上找到的几个示例编写了以下代码。设置 AVCaptureSession 时未引发 fatal error ,但未调用委托(delegate),并且在我调用 captureSession.startRunning() 时立即记录了一些明显的错误。

到目前为止,我已尝试对我的代码进行小幅调整(例如,删除输出上的 videoSettings 或 session 中的 sessionPreset),以及 checkin 我的测试应用程序具有相机访问权限的系统偏好设置。但是,日志仍然存在,并且不会调用委托(delegate)。

CameraInput 类(包括委托(delegate)):

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(新 Cocoa 应用程序中的默认 View Controller ):

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 之后,我已经排除了它是关于沙盒的问题。

最佳答案

您需要从您的 did captureOutput:didOutput 方法中删除关键字 private

我猜它改变了签名足以让你的方法不被调用。

关于swift - 如何在 macOS 中使用 AVFoundation 采集视频数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54009139/

相关文章:

macos - 协同设计不工作 "Timestamp service not available"

objective-c - 同时使用 AVCaptureSession 和 Playback Audio 录制音频/视频?

ios - 如何在表格 View 中的单元格之间放置临时单元格?

swift - 从核心数据中检索 NSOrderedSet 并将其转换为实体 managedObjectSubclasss

python - 在 Mac OS X Yosemite 上为 Python 3.2.2 安装 Matplotlib?

ios - 为什么一个方法工作得很好,但如果我把它放在 dispatch_async 中就会崩溃?

ios - 如何在 CarPlay 上播放视频?

ios - Swift - 使用未声明的类型 'GTMOAuth2Authentication'

iphone - 自动关闭 UIAlertController

python - 安装 Scikits.audiolab 时出错