Лучший способ помочь вам в достижении вашей цели - это использование Metal
фреймворка.Использование камеры Metal
хорошо для минимизации влияния на ограниченные вычислительные ресурсы устройства.Если вы пытаетесь добиться минимального доступа к датчику камеры, использование AVCaptureSession
было бы действительно хорошим началом.
Вам нужно получить данные каждого кадра из CMSampleBuffer
(вы правы), а затем преобразовать кадр в MTLTexture
.AVCaptureSession
будет непрерывно отправлять нам кадры с камеры устройства посредством обратного вызова делегата.
Все доступные наложения также должны быть преобразованы в MTLTextures
.Затем вы можете объединить все MTLTextures
слои с помощью операции over
.
Итак, здесь вы найдете всю необходимую информацию в четырехкомпонентной металлической камере серия .
А вот ссылка на блог : О композитинге в металле .
Также мне бы хотелосьчтобы опубликовать фрагмент кода (работа с AVCaptureSession in Metal):
import Metal
guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
// Handle an error here.
}
// Texture cache for converting frame images to textures
var textureCache: CVMetalTextureCache?
// `MTLDevice` for initializing texture cache
var metalDevice = MTLCreateSystemDefaultDevice()
guard
let metalDevice = metalDevice
where CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, metalDevice, nil, &textureCache) == kCVReturnSuccess
else {
// Handle an error (failed to create texture cache)
}
let width = CVPixelBufferGetWidth(imageBuffer)
let height = CVPixelBufferGetHeight(imageBuffer)
var imageTexture: CVMetalTexture?
let result = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache.takeUnretainedValue(), imageBuffer, nil, pixelFormat, width, height, planeIndex, &imageTexture)
// `MTLTexture` is in the `texture` variable now.
guard
let unwrappedImageTexture = imageTexture,
let texture = CVMetalTextureGetTexture(unwrappedImageTexture),
result == kCVReturnSuccess
else {
throw MetalCameraSessionError.failedToCreateTextureFromImage
}
И здесь вы можете найти окончательный проект на GitHub: MetalRenderCamera