iOS WebRTC:如何在StreamVideo包内集成FOV计算代码?
在StreamVideo iOS包中集成相机内参计算FOV的指导
1. 定位处理CMSampleBuffer的核心文件
StreamVideo的相机捕获逻辑集中在Sources/StreamVideo/Internal/Camera目录下,重点关注两个文件:
CameraCaptureSession.swift:负责管理AVCaptureSession,包含AVCaptureVideoDataOutput的配置逻辑CameraVideoCapturer.swift:实现了AVCaptureVideoDataOutputSampleBufferDelegate协议,是接收和处理CMSampleBuffer的核心类,其中的captureOutput(_:didOutput:from:)方法就是采样缓冲的入口
2. 启用相机内参传递
在CameraCaptureSession.swift的session初始化或配置方法中,找到AVCaptureVideoDataOutput的配置代码,添加内参启用逻辑:
if let captureConnection = videoDataOutput.connection(with: .video) { captureConnection.isEnabled = true captureConnection.isCameraIntrinsicMatrixDeliveryEnabled = true }
3. 集成FOV计算逻辑
方案一:直接修改核心类(快速验证)
在CameraVideoCapturer.swift中,将你的computeFOV函数加入类中,并在captureOutput方法中调用:
// 添加FOV计算函数 nonisolated func computeFOV(_ sampleBuffer: CMSampleBuffer) -> Double? { guard let camData = CMGetAttachment(sampleBuffer, key: kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, attachmentModeOut: nil) as? Data else { return nil } let intrinsics: matrix_float3x3? = camData.withUnsafeBytes { pointer in pointer.baseAddress?.assumingMemoryBound(to: matrix_float3x3.self).pointee } guard let intrinsics = intrinsics else { return nil } let fx = intrinsics[0][0] let w = 2 * intrinsics[2][0] return Double(atan2(w, 2 * fx)) } // 在采样缓冲处理方法中调用计算逻辑 func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { // 保留原有业务逻辑... // 计算并使用FOV值 if let horizontalFOV = computeFOV(sampleBuffer) { // 这里可以将FOV传递给业务模块,或做日志输出 print("当前水平视场角:\(horizontalFOV * 180 / .pi)°") } // 保留原有业务逻辑... }
方案二:解耦式集成(推荐,避免修改核心源码)
如果不想改动StreamVideo的核心代码,可以通过代理包装实现:
- 自定义一个代理类,实现
AVCaptureVideoDataOutputSampleBufferDelegate,在内部先处理FOV计算,再调用原代理逻辑 - 在
CameraCaptureSession配置videoDataOutput时,将原代理替换为你的自定义代理
4. 关键注意事项
- 确保已申请相机权限,无权限时无法获取内参数据
isCameraIntrinsicMatrixDeliveryEnabled仅支持iOS 11及以上版本,需做版本兼容判断- 若需要垂直FOV,可修改计算逻辑:
let fy = intrinsics[1][1] let h = 2 * intrinsics[2][1] let verticalFOV = Double(atan2(h, 2 * fy))
内容的提问来源于stack exchange,提问作者andreas.teich
相关产品推荐
相关产品推荐

