2011-07-07 3 views
3

iPhoneでできるだけ早く、カメラで写真を撮って保存しようとしています。問題は、最後まで保存せずに永遠に、または約1/2〜3/4を保存しない(Write busyエラーまたは-[NSKeyedUnarchiver initForReadingWithData:]: data is NULL)ことです。iPhoneカメラは写真をすばやく撮影しますが、保存に問題があります

私は電話のメモリを過負荷にしていますが、それを効率的に処理する方法は考えられません。標準的なiPhoneのカメラアプリはそれをうまく処理できます - ほぼ1枚/秒でスナップして問題なく保存できます。

どのようにプロセス/メモリを管理して、それが保存されてもすぐに瞬時に撮影できるようにするためのアイデアはありますか?

ここに私のコードがあります。 self.readyToTake = YESの場合はtakePictureが呼び出されます。

 
- (void)takePicture { 
    self.delegate = self; 
    [super takePicture]; 
    self.readyToTake = NO; 
} 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    self.readyToTake = YES; 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 
} 

- (void)image:(UIImage*)image didFinishSavingWithError:(NSError *)error contextInfo:(NSDictionary*)info { 
    if (error) 
    { 
     NSLog([NSString stringWithFormat:@"** ERROR SAVING PHOTO: %@", [error localizedDescription]]); 
    } 
} 

ありがとうございました!


EDIT

私は480×640のように、保存する前に、はるかに小さい寸法に写真のサイズを変更した場合、私は何の問題に迅速節約を持っていません。しかし、私はフルサイズの画像をキャプチャして保存したいと思っています。ネイティブのカメラアプリはそれをうまく処理しているようです。

答えて

2

このようにすることができます。 つまり、前の写真が保存された後にのみ次の写真を撮ることができます。 メモリ管理用の自動解放プールも導入してください。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 
    [pool drain]; 
} 


- (void)image:(UIImage*)image didFinishSavingWithError:(NSError *)error contextInfo:(NSDictionary*)info { 
    if (error) 
    { 
     NSLog([NSString stringWithFormat:@"** ERROR SAVING PHOTO: %@", [error localizedDescription]]); 
    } 
    self.readyToTake = YES; 
} 
+0

問題と上のいくつかの機能を使用してフォトアルバムに保存することができますしてください前の写真が保存された後に次の写真を有効にするということは、カメラがもはや急速に撮影しないことである。ほとんどの写真は約3〜5秒で保存できます。 –

+0

私たちはいくつかのバックグラウンドスレッドで保存機能を実行することができますが、それでも3〜5秒かかる場合、プロセスジャンクにつながる可能性があります...それはすべて私が推測するハードウェアに依存します... – Ilanchezhian

1

私が試してみた最初のものは、ディスパッチキューに非同期にこれらの呼び出しをオフロードされます。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    self.readyToTake = YES; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
     UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 
    }); 
} 

それでも問題が解決しない場合は、私がAVCaptureSessionや友人に見てね。これにより、より多くの制御と一般的により良いパフォーマンスが得られます。開発者ポータルでは、このメソッドを使用して偉大なサンプルプロジェクトがあります:あなたはまた、代わりにUIImageWriteToSavedPhotosAlbumAssetsLibraryを使用して試みることができるSquareCam

EDIT

(これは、我々はすべて我々のアプリで使用するものである)ような何か:

+0

ありがとう、アート。ディスパッチキューを使用すると、以前の約2倍のデータが保存されますが、それでも約1/3が節約され、残りの部分は 'Write busy'または' - [NSKeyedUnarchiver initForReadingWithData:]:data is NULL'になります。何かご意見は? –

+0

'AVCaptureSession'を使うと、本当に速いペースで写真を撮ることができますが、写真は同じUIImageWriteToSavedPhotosAlbumを使って(私が見た例で)保存されます。 'AVCaptureSession'を使って保存できる理由は、画像が480x640しかないからです。サイズを小さくすると現在の方法ですぐに保存できますが、通常のサイズの写真が必要です。私はあなたの助けと他のアイデアに感謝します! –

+0

実際には、あなたがイメージ 'でやっているAVCaptureSessionPresetPhoto' 'と 'AVCaptureSession'を用いたセンサからのフルサイズの写真を取得することができます:didFinishSavingWithErrorを:' –

1

「timed」ボタンをタップしたときに自動的に1秒間隔の写真を保存するdeveloper.apple.comサイトには、問題の解決策が表示される1つのベストサンプルアプリがあります。here is its code私は可能な5枚のconsicutive写真を保存することができますよう、きっとあなたを助け、1/2速

ページMyViewController.mを参照して、アレイ内の画像を取得した後、あなたは別のキュー

関連する問題