Ответ 1
Лучший способ помочь вам достичь своей цели - использовать структуру Metal
. Использование Metal
камеры полезно для минимизации воздействия на устройства ограниченных вычислительных ресурсов. Если вы пытаетесь достичь самого низкого доступа к датчику камеры, использование AVCaptureSession
было бы действительно хорошим началом.
Вам нужно захватить данные каждого кадра из CMSampleBuffer
(вы правы), а затем преобразовать фрейм в MTLTexture
. AVCaptureSession
будет постоянно отправлять нам кадры с камеры устройств через обратный вызов делегата.
Все доступные оверлеи также должны быть преобразованы в MTLTextures
. Затем вы можете комбинировать все слои MTLTextures
с over
операцией.
Итак, здесь вы найдете всю необходимую информацию в четырехчастной серии Metal Camera.
И вот ссылка на блог: О композиции в металле.
Кроме того, я хотел бы опубликовать фрагмент кода (работа с 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