CMSampleBuffer поворачивается от портрета к пейзажу в Swift 3

86
12

Я обрабатываю ReplayKit2 в iOS, по некоторым причинам мне нужно повернуть CMSampleBuffer из портрета в альбом, я обнаружил, что результат неверен.

Чего я скучаю?

это оригинальный буфер образца enter image description here

это фактический выходной буфер enter image description here

width & height - размеры sampleBuffer

func rotation(sampleBuffer: CMSampleBuffer, width: Int, height: Int) -> CMSampleBuffer {

//create pixelbuffer from the delegate method samplebuffer
let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!

CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))

//create CI image from the buffer
let image = CIImage(cvImageBuffer: pixelBuffer)

let extent = CGRect(x: 0, y: 0, width: width, height: height)

var tx = CGAffineTransform(translationX: extent.midX, y: extent.midY)

tx = tx.rotated(by: CGFloat(Double.pi / 2))

tx = tx.translatedBy(x: -extent.midX, y: -extent.midY)

var transformImage = CIFilter(
name: "CIAffineTransform",
withInputParameters: [
kCIInputImageKey: image,
kCIInputTransformKey: NSValue.init(cgAffineTransform: tx)])!.outputImage!

//create empty pixelbuffer
var newPixelBuffer : CVPixelBuffer? = nil

CVPixelBufferCreate(kCFAllocatorDefault,
width,
height,
kCVPixelFormatType_32BGRA,
nil,
&newPixelBuffer)
//render the context to the new pixelbuffer, context is a global
//CIContext variable. creating a new one each frame is too CPU intensive
self.ciContext.render(transformImage, to: newPixelBuffer!)

//finally, write this to the pixelbufferadaptor

CVPixelBufferUnlockBaseAddress(pixelBuffer,CVPixelBufferLockFlags(rawValue: 0))

var videoInfo: CMVideoFormatDescription?

CMVideoFormatDescriptionCreateForImageBuffer(kCFAllocatorDefault, newPixelBuffer!, &videoInfo)

var sampleTimingInfo = CMSampleTimingInfo(duration: CMSampleBufferGetDuration(sampleBuffer), presentationTimeStamp: CMSampleBufferGetPresentationTimeStamp(sampleBuffer), decodeTimeStamp: CMSampleBufferGetDecodeTimeStamp(sampleBuffer))

var newSampleBuffer: CMSampleBuffer?

CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, newPixelBuffer!, true, nil, nil, videoInfo!, &sampleTimingInfo, &newSampleBuffer)

return newSampleBuffer!

}

спросил(а) 2021-01-12T20:44:18+03:00 1 неделя, 3 дня назад
1
Решение
60

просто нашел очень сладкий метод в iOS 11!

/* Returns a new image representing the original image transformeded for the given CGImagePropertyOrientation */
@available(iOS 11.0, *)
open func oriented(_ orientation: CGImagePropertyOrientation) -> CIImage

ответил(а) 2021-01-12T20:44:18+03:00 1 неделя, 3 дня назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема