У меня есть 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