CMSampleBuffer から UIImage を作成しようとしています。次のコードは、背面カメラからのサンプル バッファでは正常に機能しますが、前面カメラでは機能しません。前面カメラが使用されている場合、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: 無効なデータ バイト/行: 8 整数ビット/コンポーネント、3 コンポーネント、kCGImageAlphaPremultipliedFirst の場合、少なくとも 2560 にする必要があります。」というエラーが発生しました。