2011-09-04 111 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