加速保存图像 – iOS

我正在研究更多的迷你项目,这些项目稍后将被纳入一个新项目。 这基本上是一个testing单位。

我正在做的是创build一个AVCaptureSession ,然后创build一个OutputSampleBufferDelegate方法。 在该方法中,我将sampleBuffer转换为UIImage并保存UIImage 。 当我在iPhone 4上运行应用程序时,它每秒只能保存2-3幅图像。 必须有一个更有效的方式来保存图像。

有人可以帮我加快速度吗?

谢谢!

大量的代码是从这里

 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { UIImage *resultUIImage = [self imageFromSampleBuffer:sampleBuffer]; NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(resultUIImage)]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [paths objectAtIndex:0]; CMTime frameTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); NSString *filename = [NSString stringWithFormat:@"%f.png", CMTimeGetSeconds(frameTime)]; NSString *finalPath = [path stringByAppendingString:filename]; [imageData writeToFile:finalPath atomically:YES]; } // 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); // 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]; // Release the Quartz image CGImageRelease(quartzImage); return image; } 

使用这个代码,我可以得到它保存图像的时间降低到0.1秒。

 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { double frameTime = CFAbsoluteTimeGetCurrent(); UIImage *resultUIImage = [self imageFromSampleBuffer:sampleBuffer]; // takes freaking forever to do. double pre = CFAbsoluteTimeGetCurrent(); NSData *imageData = UIImageJPEGRepresentation(resultUIImage, 0.9); NSLog(@"It took to write the file:%f",CFAbsoluteTimeGetCurrent()-pre); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory ,NSUserDomainMask , YES); NSString *path = [paths objectAtIndex:0]; NSString *filename = [NSString stringWithFormat:@"%f.png", frameTime]; NSString *finalPath = [path stringByAppendingString:filename]; [imageData writeToFile:finalPath atomically:YES]; } 

如果在第一个方法中注释掉以下行,可以看看可以生成多less图片:

 [imageData writeToFile:finalPath atomically:YES]; 

我这样说的原因是你将花费大量的时间把这个镜像写到磁盘上。 看看如何在不将图像写入磁盘的情况下执行这一操作将会很有趣。 至less你会知道,如果所有的时间都花在实际创build图像与存储图像上。 或者你可以做另一个海报提及和使用仪器时间多久,你在每种方法。

如果将图像写入磁盘时间过长,则build议尝试实施一种caching机制,将图像caching在内存中,并在稍后将其写入磁盘。

它也可能有助于尝试调用writeToFile:primefaces:在后台线程。