2010-11-02 15 views
5

Sto tentando di salvare un video registrato nella libreria utilizzando il delegato UIImagePickerController. Funziona bene per le immagini ma non salva se si tratta di un video, inoltre dopo aver provato a salvare un video se apro l'app Foto, ricevo un messaggio "Attendere. Libreria Updatring" e una barra di avanzamento con l'etichetta " Ricostruzione della biblioteca ". La mia libreria di foto è stata ripristinata ma il video non è stato aggiunto.Problema di salvataggio dei video registrati nella libreria di 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]; 

} 

Il NSLog sopra emette il seguente:

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

chiunque ha implementato tale metodo e mi può indicare la giusta direzione per favore?

Grazie.

risposta

6

Penso di vedere un problema.

NSString* m_objMediaURL= [info objectForKey:UIImagePickerControllerMediaURL];

è il tipo sbagliato. Il mio codice funzionante utilizza:

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

copio invece di mantenere a causa di alcuni problemi che ho avuto in situazioni di memoria insufficiente dopo la vista selettore è respinto. Anche se il metodo di salvataggio si utilizza potrebbe funzionare, io uso il più recente e migliore (a causa del blocco di callback):

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

Inoltre, si dovrebbe utilizzare kUTTypeMovie e kUTTypeImage invece di difficile codifica @"public.image.

+0

'UISaveVideoAtPathToSavedPhotosAlbum' non sembra funzionare molto bene. Andare con 'ALAssetsLibrary' è sicuramente l'opzione migliore. – znq

1

Perché stai passando nil, nil, nil nel metodo - se si passa a più opzioni, vi dirà l'errore;)

provare qualcosa di simile, invece:

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

e più tardi nella tua classe mettere questo metodo

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

Speranza l'output di che voi :) aiuta


EDIT:

lettura the docs un po 'di più, avete eseguito questo metodo per verificare che si tratta di un video valido?

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

Ho trovato il problema grazie all'aiuto di Peter. Risulta che [info objectForKey: UIImagePickerControllerMediaURL] restituisce un NSURL e non un NSString. Così, alla fine ecco come il mio metodo sembra

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

    NSURL *videoURL= [info objectForKey:UIImagePickerControllerMediaURL]; 

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


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

Questo metodo utilizza il nuovo quadro ALAssetsLibrary. Segue l'intero metodo, che supporta il salvataggio di un'immagine o di un film:

- (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]; 
} 
Problemi correlati