从 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,但在这种情况下,我得到了一组灰色和倒置的图片(附后)
急于解决这个问题?
事实上我做了一个愚蠢的事情导致了上面的错误。
关注此 convert CMSampleBufferRef to UIImage 问题。
我这样做了:
var videoCaptureOutput = AVCaptureVideoDataOutput()
videoCaptureOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey:Int(kCVPixelFormatType_32BGRA)]
这是一个相当受欢迎的问题,但我还没有找到解决问题的办法。 我正在以这种方式从 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,但在这种情况下,我得到了一组灰色和倒置的图片(附后)
急于解决这个问题?
事实上我做了一个愚蠢的事情导致了上面的错误。
关注此 convert CMSampleBufferRef to UIImage 问题。
我这样做了:
var videoCaptureOutput = AVCaptureVideoDataOutput()
videoCaptureOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey:Int(kCVPixelFormatType_32BGRA)]