如何获取实时摄像头流?以及如何通过WWDC24新CameraFrameProvider获取当前帧?
获取实时摄像头流及CameraFrameProvider使用指南
一、通用iOS实时摄像头流获取方式
在iOS平台上,最常用的方案是基于AVFoundation框架实现,核心步骤如下:
- 初始化
AVCaptureSession作为捕获会话核心,根据需求设置会话预设(如AVCaptureSession.Preset.high) - 创建
AVCaptureDeviceInput,指定要使用的摄像头设备(前置/后置),并将其添加到会话中 - 配置
AVCaptureVideoDataOutput,设置AVCaptureVideoDataOutputSampleBufferDelegate代理,通过captureOutput(_:didOutput:from:)代理方法获取每帧的CMSampleBuffer数据,可进一步转换为UIImage或直接处理像素缓冲区 - 调用
AVCaptureSession.startRunning()启动会话,开始捕获实时摄像头流
二、使用WWDC24推出的CameraFrameProvider获取摄像头帧
CameraFrameProvider是ARKit针对企业开发者推出的新API,简化了从ARKit会话中获取摄像头帧的流程,具体步骤:
- 初始化ARKit会话:创建
ARSession实例,并配置合适的ARConfiguration(如ARWorldTrackingConfiguration) - 获取CameraFrameProvider实例:通过
ARSession的cameraFrameProvider属性直接获取该API实例 - 设置帧回调闭包:调用
setFrameDeliveryHandler(_:)方法传入闭包,实时接收CameraFrame对象,其中包含像素缓冲区(pixelBuffer)、时间戳等关键信息 - 启动ARKit会话:调用
ARSession.run(_:)启动会话,即可开始接收摄像头帧
代码示例(Swift)
import ARKit class CameraCaptureManager: NSObject { private let arSession = ARSession() private var frameProvider: CameraFrameProvider? func startFrameCapture() { let config = ARWorldTrackingConfiguration() arSession.run(config) frameProvider = arSession.cameraFrameProvider frameProvider?.setFrameDeliveryHandler { frame in guard let pixelBuffer = frame.pixelBuffer else { return } // 此处处理像素缓冲区,例如转换为UIImage、进行计算机视觉处理等 print("捕获到摄像头帧,时间戳:\(frame.timestamp)") } } func stopFrameCapture() { arSession.pause() frameProvider?.setFrameDeliveryHandler(nil) } }
注意事项
- 必须在
Info.plist中添加NSCameraUsageDescription权限描述,否则应用无法访问摄像头 - CameraFrameProvider依赖ARKit,仅支持搭载A9芯片及以上的iOS设备
- 需使用具备对应权限的企业开发者账号,才能正常调用该API
内容的提问来源于stack exchange,提问作者闪电狮
相关产品推荐
相关产品推荐

