swift - 如何使用 AVFoundation 在 macOS 中捕获视频数据?
问题描述
我根据我在网上找到的几个示例编写了下面的代码,以便从 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(新可可应用中的默认视图控制器):
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
非常感谢任何帮助使其工作的帮助!另外,如果需要更多信息,请通知我。
编辑 遇到这个问题后,我已经排除了这是关于沙盒的问题。
解决方案
您需要private
从 didcaptureOutput:didOutput
方法中删除关键字。
我猜它改变了签名足以让你的方法不被调用。
推荐阅读
- c++ - 在可移动类型的构造函数 lambda 中安全使用捕获的 this
- networking - 无法ping主路由器默认网关
- c# - 如何访问 Powershell 二进制模块 FileList 属性中的文件
- distributed - 如何从分布式表中获取数据
- knockout.js - 淘汰赛无法使用函数代替 ko.computed()
- qt-creator - 如何将 Magick++ 添加到 Qt Creator
- regex - 在目录中搜索模式并使用 PowerShell 从文件中提取字符串
- reactjs - React 上下文和 Next JS
- angular - 错误模块构建失败(来自 ./node_modules/sass-loader/lib/loader.js):
- python - 在同一台机器上拥有不同版本的 Python 和 Anaconda