Speed ​​Up Image Saving - iOS

I am working on a large number of mini-projects, which will later be included in the new project. This is basically a test unit.

What I am doing is creating an AVCaptureSession and then creating a method for OutputSampleBufferDelegate . In the method, I convert sampleBuffer to UIImage and save the UIImage . When I run the application on my iPhone 4, it can only save 2-3 images per second. There should be a more efficient way to save the image.

Can someone help me speed it up?

Thanks!

a lot of code here

 - (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 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; } 
+6
source share
2 answers

Using this code, I can get the time when it saves the image up to 0.1 s.

 - (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]; } 
+8
source

Could you see how many images you can create if you comment on the following line in your first method:

 [imageData writeToFile:finalPath atomically:YES]; 

The reason I say that you are going to spend a lot of time writing this image to disk. It would be interesting to see how this is done without writing the image to disk. At least, this is how you learn, all the time is spent on creating an image and storing an image. Or you could do, as another poster was mentioned, and use the Tools on time for how long you are in each method.

If it turns out that writing images to disk takes too much time, I suggest trying to implement a caching mechanism that will cache images in memory and later write them to disk.

It can also help to call writeToFile: atomically: on the background thread.

+3
source

Source: https://habr.com/ru/post/892101/


All Articles