2

UIImageView 内で UIImages に変換された CMSampleBuffers のビデオ フィードを表示しています。下の写真では、背景レイヤーが AVCapturePreviewLayer で、中央がバッファー フィードです。私の目標は、青みを取り除くことです。

ここに画像の説明を入力

CMSampleBuffer から UIImage へのコードは次のとおりです。

extension CMSampleBuffer {
  func imageRepresentation() -> UIImage? {

    let imageBuffer: CVImageBufferRef = CMSampleBufferGetImageBuffer(self)!

    CVPixelBufferLockBaseAddress(imageBuffer, 0)
    let address = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)
    let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
    let width = CVPixelBufferGetWidth(imageBuffer)
    let height = CVPixelBufferGetHeight(imageBuffer)

    let colorSpace = CGColorSpaceCreateDeviceRGB()

    let context = CGBitmapContextCreate(address, width, height, 8, bytesPerRow, colorSpace, CGImageAlphaInfo.NoneSkipFirst.rawValue)
    let imageRef = CGBitmapContextCreateImage(context)

    CVPixelBufferUnlockBaseAddress(imageBuffer, 0)
    let resultImage: UIImage = UIImage(CGImage: imageRef!)

    return resultImage
  }
}

AVCaptureVideoDataOutput セットアップ:

class MovieRecorder: NSObject {
  // vars
  private let captureVideoDataOutput = AVCaptureVideoDataOutput()

  // capture session boilerplate setup...

  captureVideoDataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA)]
  captureVideoDataOutput.alwaysDiscardsLateVideoFrames = true
  captureVideoDataOutput.setSampleBufferDelegate(self, queue: captureDataOutputQueue)
}
4

1 に答える 1