2017-09-23 119 views
0

我在iOS中处理ReplayKit2,由于某些原因,我需要将纵向的CMSampleBuffer旋转为横向,我发现结果不正确。CMSampleBuffer在Swift 3中从纵向旋转到纵向3

我想念什么?

这是原始样品缓冲液enter image description here

这是实际的输出缓冲器enter image description here

宽度&高度是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! 

    } 

回答

0

刚刚找到一个非常甜方法在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 
相关问题