2010-11-02 12 views
5

Estoy tratando de guardar un video grabado en la biblioteca usando el delegado UIImagePickerController. Funciona bien para las imágenes, pero no se guarda si se trata de un video, además de intentar guardar un video si abro la aplicación Photos, aparece un mensaje "Espere, Updater library" y una barra de progreso con la etiqueta " Reconstrucción de la biblioteca ". Mi fototeca se restauró pero el video no se agregó.Problema al guardar el video grabado en la biblioteca del iPhone

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 


    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 

    if ([mediaType isEqualToString:@"public.image"]){ 
      UIImage *picture = [info objectForKey:UIImagePickerControllerOriginalImage]; 
      UIImageWriteToSavedPhotosAlbum(picture, nil, nil, nil); 
    } 
    else if ([mediaType isEqualToString:@"public.movie"]){ 

      NSString* m_objMediaURL= [info objectForKey:UIImagePickerControllerMediaURL]; 
      NSLog(@"URL is %@", m_objMediaURL); 
      UISaveVideoAtPathToSavedPhotosAlbum(m_objMediaURL, nil, nil, nil); 
    } 

    [self dismissModalViewControllerAnimated:YES]; 

} 

El NSLog anterior muestra la siguiente información:

URL is 
file://localhost/private/var/mobile/Applications/3800A5FB-2A96-4A7A-85DF-B635E8D9A66C/tmp/capture-T0x1061f0.tmp.JMdxHq/capturedvideo.MOV 

Alguien ha implementado tal método y me puede apuntar en la dirección correcta, por favor?

Gracias.

Respuesta

6

Creo que veo un problema.

NSString* m_objMediaURL= [info objectForKey:UIImagePickerControllerMediaURL];

es el tipo equivocado. Mi código que funcione correctamente utiliza:

NSURL *url = [[[info objectForKey:UIImagePickerControllerMediaURL] copy] autorelease];

lo copio en lugar de retenerlo debido a algunos problemas que he tenido en situaciones de poca memoria después de que el selector de vista es despedido. Aunque el método de almacenamiento que utiliza podría funcionar, yo uso el más nuevo y mejor (debido al bloque de devolución de llamada):

ALAssetsLibrary* library = [[[ALAssetsLibrary alloc] init] autorelease]; 
[library writeVideoAtPathToSavedPhotosAlbum:url 
          completionBlock:^(NSURL *assetURL, NSError *error){/*notify of completion*/}]; 

También, usted debe utilizar kUTTypeMovie y kUTTypeImage en lugar de codificar duro @"public.image.

+0

'UISaveVideoAtPathToSavedPhotosAlbum' no parece funcionar muy bien. Ir con 'ALAssetsLibrary' es definitivamente la mejor opción. – znq

1

¿Por qué está pasando nulo, nulo, nulo en el método - si se pasa en más opciones, se le informará el error;)

intentar algo como esto en su lugar:

UISaveVideoAtPathToSavedPhotosAlbum(m_objMediaURL, self, @selector(video:didFinishSavingWithError:contextInfo:), nil); 

y más tarde en su clase de poner este método

- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { 
    // Let's see what happened 
    NSLog(@"path : %@", path); 
    NSLog(@:error : %@", error); 
} 

Esperamos que la salida de ese ti :) ayuda


EDIT:

lectura the docs un poco más, has ejecutar este método para comprobar que se trata de un video válida?

BOOL isVideoOK = UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(m_objMediaURL); 
if (NO == isVideoOK) 
    NSLog(@"Video at %@ is not compatible", m_objMediaURL); 
3

Encontré el problema gracias a la ayuda de Peter. Resulta que [info objectForKey: UIImagePickerControllerMediaURL] devuelve un NSURL y no un NSString. Así que, al final, así es cómo se ve mi método

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

    NSURL *videoURL= [info objectForKey:UIImagePickerControllerMediaURL]; 

    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:videoURL]) 
    { 
     [library writeVideoAtPathToSavedPhotosAlbum:videoURL 


            completionBlock:^(NSURL *assetURL, NSError *error){} 
      ]; 
     } 
[library release]; 

Este método utiliza la nueva estructura ALAssetsLibrary. Todo el método, que admite guardar una imagen o película, sigue:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 


    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 

    if ([mediaType isEqualToString:@"public.image"]){ 

     UIImage *picture= [info objectForKey:UIImagePickerControllerOriginalImage]; 
     NSDictionary *metadata = [info objectForKey:UIImagePickerControllerMediaMetadata]; 

     [library writeImageToSavedPhotosAlbum:[picture CGImage] metadata:metadata 
           completionBlock:^(NSURL *assetURL, NSError *error){} 
     ]; 

    } 
    else if ([mediaType isEqualToString:@"public.movie"]){ 

     NSURL *videoURL= [info objectForKey:UIImagePickerControllerMediaURL]; 

     if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:videoURL]) 
     { 
      [library writeVideoAtPathToSavedPhotosAlbum:videoURL 
             completionBlock:^(NSURL *assetURL, NSError *error){} 
      ]; 
     } 

    } 


    [library release];  
    [self dismissModalViewControllerAnimated:YES]; 
} 
Cuestiones relacionadas