Приведенный ниже код работает на iPad mini и iPhone 7 для создания снимка текущего видеокадра, но при запуске iPad Pro выдает ошибку: CIImage initWithCVPixelBuffer: options: fail, потому что его формат пикселей p422 не поддерживается ,
Есть похожий вопрос "CIImage initWithCVPixelBuffer: options:" не удалось, поскольку его формат пикселей p422 не поддерживается в iOS 10 , но это не решает проблему.
Насколько я понимаю, это связано с видео в формате 4: 2: 2. Есть ли обходной путь, чтобы сохранить 4: 2: 2? Изменение самого видео было бы слишком хлопотным, так как многие другие функции должны были бы быть отредактированы.
func snapshotCurrentFrame() -> UIImage? {
guard
let item = playerLayer?.player?.currentItem,
let output = item.outputs.first as? AVPlayerItemVideoOutput,
let pixelBuffer = output.copyPixelBuffer(forItemTime: item.currentTime(), itemTimeForDisplay: nil)
else { return nil }
let rect = CGRect(
x: 0,
y: 0,
width: CVPixelBufferGetWidth(pixelBuffer),
height: CVPixelBufferGetHeight(pixelBuffer)
)
let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
if let cgImage = CIContext().createCGImage(ciImage, from: rect) {
return UIImage(cgImage: cgImage)
} else {
return nil
}
}