Я пытаюсь создать 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».
captureOutup(_ output: AVCaptureOutput, sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
AVCaptureVideoDataOutputSampleBufferDelegate
. Указанный формат отлично работает для буфера задней камеры, поэтому я предполагаю, что он будет таким же для передней камеры, но это не так. - person Loc Nguyen   schedule 27.02.2018CVPixelBufferGetPixelFormatType(imageBuffer)
дает вам формат - person Valérian   schedule 27.02.2018OSType
для создания UIImage? - person Loc Nguyen   schedule 28.02.2018imageBuffer
содержит не RGB, а YUV, и в этом случае вам нужно сначала преобразовать. Что заOSType
было возвращено? - person Valérian   schedule 28.02.2018VTPixelTransferSession
, либо с использованиемvImage
(это то, что сеанс передачи пикселей использует под капотом) - person Valérian   schedule 07.03.2018VTPixelTransferSession
недоступно на iOS. Не могли бы вы поделиться фрагментом для преобразования буфера с помощью vImage? - person Loc Nguyen   schedule 08.03.2018