2010-11-02 4 views
5

Je tente d'enregistrer une vidéo enregistrée dans la bibliothèque à l'aide du délégué UIImagePickerController. Cela fonctionne bien pour les photos, mais il ne sauvegarde pas si c'est une vidéo, plus après avoir essayé d'enregistrer une vidéo si j'ouvre l'application Photos, je reçois un message "Veuillez patienter, bibliothèque Updatring", et une barre de progression avec l'étiquette " Reconstruire la bibliothèque ". Ma photothèque est restaurée mais la vidéo n'y a pas été ajoutée.Problème lors de la sauvegarde de la vidéo enregistrée dans la bibliothèque de l'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]; 

} 

Les NSLog sorties au-dessus de ce qui suit:

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

Quelqu'un at-il mis en œuvre cette méthode et peut me pointer vers la bonne direction s'il vous plaît?

Merci.

Répondre

6

Je pense que je vois un problème.

NSString* m_objMediaURL= [info objectForKey:UIImagePickerControllerMediaURL];

Est-ce le mauvais type. Mon code fonctionne correctement utilise:

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

je copie au lieu de le conserver en raison de certains problèmes que j'ai eu dans des situations de faible mémoire après le point de vue du sélecteur est rejeté. Bien que le travail d'utiliser méthode de sauvegarde pourrait, j'utiliser le plus récent et mieux (à cause du bloc de rappel):

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

En outre, vous devez utiliser kUTTypeMovie et kUTTypeImage au lieu de coder en dur @"public.image.

+0

'UISaveVideoAtPathToSavedPhotosAlbum' ne semble pas fonctionner très bien. Aller avec le 'ALAssetsLibrary' est certainement la meilleure option. – znq

1

Pourquoi Vous êtes de passage nul, nul, nul dans la méthode - si vous passez plus d'options, il vous dira l'erreur;)

Essayez quelque chose comme ceci:

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

et plus tard dans votre classe de mettre cette méthode

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

espère que la sortie qui vous aide :)


EDIT:

Lecture the docs un peu plus, avez-vous exécuter cette méthode pour vérifier que c'est une vidéo valide?

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

J'ai trouvé le problème grâce à l'aide de Peter. Il s'avère que [info objectForKey: UIImagePickerControllerMediaURL] renvoie un NSURL et non un NSString. Donc, à la fin est ici comment ma méthode ressemble

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

    NSURL *videoURL= [info objectForKey:UIImagePickerControllerMediaURL]; 

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


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

Cette méthode utilise le nouveau cadre ALAssetsLibrary. Toute la méthode qui prend en charge l'enregistrement d'une image ou un film, suit:

- (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]; 
} 
Questions connexes