CMSampleBuffer с фронтальной камеры в UIImage

Я пытаюсь создать UIImage из CMSampleBuffer. Следующий код прекрасно работает для буферов образцов с задней камеры, но не с фронтальной камеры. Когда используется фронтальная камера, CGContext не может инициализироваться, т.е. конструктор CGContext возвращает nil. Я подозреваю, что мне нужно использовать правильную растровую информацию, но комбинаций так много.

func convert(buffer: CMSampleBuffer) -> UIImage? {

   guard let imageBuffer = CMSampleBufferGetImageBuffer(buffer) else { return nil }

   CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags.readOnly)



   let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer)

   let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)

   let width = CVPixelBufferGetWidth(imageBuffer)

   let height = CVPixelBufferGetHeight(imageBuffer)



   let colorSpace = CGColorSpaceCreateDeviceRGB()

   var bitmapInfo: UInt32 = CGBitmapInfo.byteOrder32Little.rawValue

   bitmapInfo |= CGImageAlphaInfo.premultipliedFirst.rawValue & CGBitmapInfo.alphaInfoMask.rawValue

   let context = CGContext(data: baseAddress, width: width, height: height, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo)



   guard let quartzImage = context?.makeImage() else { return nil }

   CVPixelBufferUnlockBaseAddress(imageBuffer, CVPixelBufferLockFlags.readOnly)

   let image = UIImage(cgImage: quartzImage)



   return image

}

Это сопровождалось следующей ошибкой: "CGBitmapContextCreate: недопустимые байты данных / строка: должно быть не менее 2560 для 8 целочисленных бит / компонент, 3 компонента, kCGImageAlphaPremultipliedFirst".

0 ответов

Другие вопросы по тегам