2017-09-23 16 views
0

iOSでReplayKit2を処理していますが、何らかの理由でCMSampleBufferをポートレートからランドスケープにする必要がありますが、結果が正しくないことがわかりました。Swift 3でCMSampleBufferをポートレートからランドスケープに回す

私が見逃していますか?

これは、これが実際の出力バッファ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 
関連する問題