从 CMSampleBufferr 制作 UIImage 会发生什么?

What happens with making UIImage from CMSampleBufferr?

这是一个相当受欢迎的问题,但我还没有找到解决问题的办法。 我正在以这种方式从 iPhone 的前置摄像头捕获帧

func captureOutput(captureOutput: AVCaptureOutput, didOutputSampleBuffer sampleBuffer: CMSampleBufferRef, fromConnection connection: AVCaptureConnection) {
    let uiImage = imageFromSampleBufferDep(sampleBuffer)
    ...
    UIImageWriteToSavedPhotosAlbum(uiImage!, self, "image:didFinishSavingWithError:contextInfo:", nil)
    ...
}

func imageFromSampleBufferDep(sampleBuffer: CMSampleBuffer) -> UIImage? {
    let imageBuffer: CVImageBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer)!
    CVPixelBufferLockBaseAddress(imageBuffer, 0)
    let address = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)
    let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer) //1924
    let width = CVPixelBufferGetWidth(imageBuffer) //1280
    let height = CVPixelBufferGetHeight(imageBuffer) //720

    let colorSpace = CGColorSpaceCreateDeviceRGB()

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

    CVPixelBufferUnlockBaseAddress(imageBuffer, 0)
    var resultImage : UIImage?
    if context != nil {
        resultImage = UIImage(CGImage: imageRef!)
    }

    return resultImage
}

我有一个错误:

<Error>: CGBitmapContextCreate: invalid data bytes/row: should be at least 5120 for 8 integer bits/component, 3 components, kCGImageAlphaNoneSkipFirst.

我试图直接将bytesPerRow赋值给5120,但在这种情况下,我得到了一组灰色和倒置的图片(附后)

急于解决这个问题?

enter image description here

事实上我做了一个愚蠢的事情导致了上面的错误。

关注此 convert CMSampleBufferRef to UIImage 问题。

我这样做了:

var videoCaptureOutput = AVCaptureVideoDataOutput()

videoCaptureOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey:Int(kCVPixelFormatType_32BGRA)]