2011-09-04 52 views
2

我正在开发一个包含一些标准“照相机”功能的iPhone应用程序。保存到相机胶卷真的太慢了​​,它需要在iPhone 4上四秒钟。有什么方法可以提高速度?writeImageToSavedPhotosAlbum太慢?

如果您查看默认的iPhone相机应用程序,它可以不需要大的延迟就可以拍摄后续照片,并且相片可以立即保存到磁盘中(如果您在拍摄最后一张照片时点击小方块,屏幕上,照片库始终会在保存的照片上打开,即使您拍摄了大量照片)。

下面是我用来从缓冲区获取图像然后将照片保存在相机胶卷中的重要代码的两个snipplets;我试图在第二个snipplet之前和之后放置一个NSLog,并确认了4秒的延迟来完成保存过程。

[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) 
{ 
    NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 
    UIImage *image = [[UIImage alloc] initWithData:imageData]; 

...

 ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease]; 
    NSLog(@"SCATTO: Inizio salvataggio in library..."); 
    [library writeImageToSavedPhotosAlbum:[image CGImage] metadata:exifAttachments_dictionary completionBlock:^(NSURL *newURL, NSError *error) { 
     if (error){ 
      NSLog(@"SCATTO: Salvataggio in library: ERRORE"); 
     } else { 
      NSLog(@"SCATTO: Salvataggio in library: OK"); 
      [self loadNewestPhoto]; 
     } 
    }]; 
+0

从你的代码中,我认为这是全部异步完成的。我不明白为什么延迟会成为问题? – elslooo

+0

这不是问题,但如果延迟时间缩短到最低限度,让用户直接进入照片库并打开他刚刚拍摄的照片将会很好... – flip79

回答

9

我不是这方面的专家,但我好奇的话题。

我认为总会有大量的时间来保存图像。如果您希望支持将来可能会创建比今天更大的图像的iPhone,则情况尤其如此。

我认为可以提高性能的一件事是如果您使用-(void)writeImageDataToSavedPhotosAlbum: ... 而不是- (void)writeImageToSavedPhotosAlbum: ...。那么JPEG提取和压缩过程可以被忽略。这是非常昂贵的,因为它将大约3MB的数据转换为大约15MB。

这是纯粹的推测,但如果JPEG提取/压缩是硬件加速的,如果您同时显示相机输出,则可能会占用硬件资源。所以这个过程必须由CPU完成。

+0

非常感谢!现在节省的时间大约是1.6秒,它不像苹果相机应用程序的表现,但它确实更好!我很好奇,如果有其他用户的其他提示,以进一步提高... – flip79

+0

'(void)writeImageDataToSavedPhotosAlbum'是否写入RAW数据或从AVCaptureStillImageOutput编码的数据?最终,我需要在发送到服务器之前压缩JPEG。 – wprater