You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取实时摄像头流?以及如何通过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会话中获取摄像头帧的流程,具体步骤:

  1. 初始化ARKit会话:创建ARSession实例,并配置合适的ARConfiguration(如ARWorldTrackingConfiguration)
  2. 获取CameraFrameProvider实例:通过ARSession的cameraFrameProvider属性直接获取该API实例
  3. 设置帧回调闭包:调用setFrameDeliveryHandler(_:)方法传入闭包,实时接收CameraFrame对象,其中包含像素缓冲区(pixelBuffer)、时间戳等关键信息
  4. 启动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,提问作者闪电狮

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:36:08