我有一个绘制了虚拟对象的 ARSCNView。虚拟对象被绘制在用户的脸上。会话具有以下配置:
let configuration = ARFaceTrackingConfiguration()
configuration.worldAlignment = .gravityAndHeading
sceneView.session.run(configuration)
此 ARSCNView 是视频通话的一部分。如果我们像下面这样发回像素缓冲区,
public func session(_ session: ARSession, didUpdate frame: ARFrame) {
videoSource.sendBuffer(frame.capturedImage, timestamp: frame.timestamp)
}
虚拟对象不会显示给我的调用者。
我尝试过的一件事是,不依赖ARSessionDelegate
的回调,而是使用 DispatchSourceTimer 发送事件。
func startCaptureView() {
// Timer with 0.1 second interval
timer.schedule(deadline: .now(), repeating: .milliseconds(100))
timer.setEventHandler { [weak self] in
// Turn sceneView data into UIImage
guard let sceneImage: CGImage = self?.sceneView.snapshot().cgImage else {
return
}
self?.videoSourceQueue.async { [weak self] in
if let buffer: CVPixelBuffer = ImageProcessor.pixelBuffer(forImage: sceneImage) {
self?.videoSource.sendBuffer(buffer, timestamp: Double(mach_absolute_time()))
}
}
}
timer.resume()
}
呼叫者缓慢地接收数据,视频体验不连贯,并且图像大小不合适。
关于如何与捕获的帧一起发送有关虚拟对象的数据的任何建议?
参考:https ://medium.com/agora-io/augmented-reality-video-conference-6845c001aec0