¿Cuál es la mejor manera de grabar un video con realidad aumentada?

¿Cuál es la mejor manera de grabar un video con realidad aumentada? (agregar texto, logotipo de imágenes a los marcos de la cámara del iPhone / iPad)

Anteriormente estaba tratando de descubrir cómo dibujarCIImage (¿Cómo dibujar texto en CIImage?) y convertirCIImage de regresoCMSampleBuffer (CIImage de vuelta a CMSampleBuffer)

Casi hice todo, solo tengo problemas para grabar videos usando nuevosCMSampleBuffer enAVAssetWriterInput

Pero esta solución de todos modos no es buena en absoluto, consume mucha CPU al convertirCIImage aCVPixelBuffer (ciContext.render(ciImage!, to: aBuffer))

Así que quiero detenerme aquí y encontrar otras formas de grabar un video con realidad aumentada (por ejemplo, agregar (dibujar) dinámicamente texto dentro de cuadros mientras codifica el video en un archivo mp4)

Aquí lo que he probado y ya no quiero usar ...

// convert original CMSampleBuffer to CIImage, 
// combine multiple `CIImage`s into one (adding augmented reality -  
// text or some additional images)
let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
let ciimage : CIImage = CIImage(cvPixelBuffer: pixelBuffer)
var outputImage: CIImage?
let images : Array<CIImage> = [ciimage, ciimageSec!] // add all your CIImages that you'd like to combine
for image in images {
    outputImage = outputImage == nil ? image : image.composited(over: outputImage!)
}

// allocate this class variable once         
if pixelBufferNew == nil {
    CVPixelBufferCreate(kCFAllocatorSystemDefault, CVPixelBufferGetWidth(pixelBuffer),  CVPixelBufferGetHeight(pixelBuffer), kCVPixelFormatType_32BGRA, nil, &pixelBufferNew)
}

// convert CIImage to CVPixelBuffer
let ciContext = CIContext(options: nil)
if let aBuffer = pixelBufferNew {
    ciContext.render(outputImage!, to: aBuffer) // >>> IT EATS A LOT OF <<< CPU
}

// convert new CVPixelBuffer to new CMSampleBuffer
var sampleTime = CMSampleTimingInfo()
sampleTime.duration = CMSampleBufferGetDuration(sampleBuffer)
sampleTime.presentationTimeStamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
sampleTime.decodeTimeStamp = CMSampleBufferGetDecodeTimeStamp(sampleBuffer)
var videoInfo: CMVideoFormatDescription? = nil
CMVideoFormatDescriptionCreateForImageBuffer(kCFAllocatorDefault, pixelBufferNew!, &videoInfo)
var oBuf: CMSampleBuffer?
CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixelBufferNew!, true, nil, nil, videoInfo!, &sampleTime, &oBuf)

/*
try to append new CMSampleBuffer into a file (.mp4) using 
AVAssetWriter & AVAssetWriterInput... (I met errors with it, original buffer works ok 
- "from func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)")
*/*

¿Hay alguna solución mejor?

Respuestas a la pregunta(1)

Su respuesta a la pregunta