Pregunta

Estoy desarrollando una aplicación para iPhone que incluye algunas funciones estándar de "cámara". Guardar en el rollo de cámara es realmente demasiado lento, requiere unos cuatro segundos en el iPhone 4. ¿Hay alguna forma de mejorar la velocidad?

Si observa la aplicación predeterminada de la cámara del iPhone, puede tomar fotos posteriores sin grandes retrasos, y las fotos se guardan instantáneamente en el disco (si hace clic en el cuadrado pequeño con la última foto tomada, en la esquina inferior de la pantalla, la pantalla, el La biblioteca de fotos siempre se abre en la imagen guardada, incluso si toma una gran secuencia de ellas).

Aquí hay dos fragmentos del código significativo que uso para obtener la imagen del búfer y luego para guardar la foto en el rollo de la cámara; Traté de poner un NSLOG antes y después del segundo fragmento, y confirmó un retraso de 4 segundos para completar el proceso de guardado.

[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];
         }
     }];
¿Fue útil?

Solución

No soy un experto en esto, pero tengo curiosidad por el tema.

Creo que siempre habrá una cantidad significativa de tiempo necesaria para ahorrar una imagen. Esto es especialmente cierto si desea admitir futuros iPhones que probablemente creen imágenes más grandes que hoy.

Una cosa que creo que puede mejorar el rendimiento es si usa -(void)writeImageDataToSavedPhotosAlbum: ...en vez de - (void)writeImageToSavedPhotosAlbum: .... El proceso de extracción y compresión JPEG se puede ignorar entonces. Es muy costoso ya que transforma aproximadamente 3 MB de datos a aproximadamente 15 MB.

Esta es pura especulación, pero si la extracción/compresión JPEG se acelera el hardware, el recurso de hardware puede estar ocupado si muestra la salida de la cámara al mismo tiempo. Entonces el proceso debe ser realizado por la CPU.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top