мы можем легко вызвать функции Objective-C ++ из Swift
учше всего записать видео с дополненной реальностью? (добавление текста, изображений логотипов в кадры с камеры iPhone / iPad)
Ранее я пытался понять, как привлечьCIImage
(Как нарисовать текст в CIImage?) и конвертироватьCIImage
вернуться кCMSampleBuffer
(CIImage обратно в CMSampleBuffer)
Я почти все сделал, только проблема с записью видео с использованием новогоCMSampleBuffer
вAVAssetWriterInput
Но это решение в любом случае не очень хорошо, оно потребляет много ресурсов процессора при конвертацииCIImage
вCVPixelBuffer
(ciContext.render(ciImage!, to: aBuffer)
)
Поэтому я хочу остановиться здесь и найти другие способы записи видео с дополненной реальностью (например, динамическое добавление (рисование) текста внутри кадров при кодировании видео в файл mp4).
Вот что я пробовал и не хочу больше использовать ...
// 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)")
*/*
Есть ли лучшее решение?