Last active
April 3, 2018 13:37
-
-
Save SongJiaqiang/a89daa8e17d06fbb29bee002ee05caff to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Create a UIImage from sample buffer data | |
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer { | |
// Get a CMSampleBuffer's Core Video image buffer for the media data | |
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); | |
// Lock the base address of the pixel buffer | |
CVPixelBufferLockBaseAddress(imageBuffer, 0); | |
// Get the number of bytes per row for the pixel buffer | |
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); | |
// Get the number of bytes per row for the pixel buffer | |
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); | |
// Get the pixel buffer width and height | |
size_t width = CVPixelBufferGetWidth(imageBuffer); | |
size_t height = CVPixelBufferGetHeight(imageBuffer); | |
NSLog(@"w: %zu h: %zu bytesPerRow:%zu", width, height, bytesPerRow); | |
// Create a device-dependent RGB color space | |
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); | |
// Create a bitmap graphics context with the sample buffer data | |
CGContextRef context = CGBitmapContextCreate(baseAddress, | |
width, | |
height, | |
8, | |
bytesPerRow, | |
colorSpace, | |
kCGBitmapByteOrder32Little | |
| kCGImageAlphaPremultipliedFirst); | |
// Create a Quartz image from the pixel data in the bitmap graphics context | |
CGImageRef quartzImage = CGBitmapContextCreateImage(context); | |
// Unlock the pixel buffer | |
CVPixelBufferUnlockBaseAddress(imageBuffer,0); | |
// Free up the context and color space | |
CGContextRelease(context); | |
CGColorSpaceRelease(colorSpace); | |
// Create an image object from the Quartz image | |
//UIImage *image = [UIImage imageWithCGImage:quartzImage]; | |
UIImage *image = [UIImage imageWithCGImage:quartzImage | |
scale:1.0f | |
orientation:UIImageOrientationRight]; | |
// Release the Quartz image | |
CGImageRelease(quartzImage); | |
return (image); | |
} | |
// CoreImage | |
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer { | |
// get pixelbuffer from samplebuffer | |
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); | |
// get CIImage from pixelbuffer | |
CIImage* ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer]; | |
// create CIContext | |
CIContext* context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(YES)}]; | |
// create CGImageRef from ciimage | |
CGRect rect = CGRectMake(0, 0, CVPixelBufferGetWidth(pixelBuffer), CVPixelBufferGetHeight(pixelBuffer)); | |
CGImageRef videoImage = [context createCGImage:ciImage fromRect:rect]; | |
// create UIImage from CGImageRef | |
UIImage* image = [UIImage imageWithCGImage:videoImage]; | |
// release CGImageRef | |
CGImageRelease(videoImage); | |
return image; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment