2012-05-07 11 views
24

En mi aplicación, debo seleccionar cualquier archivo de video y mostrar la URL de un archivo de video en la aplicación.Cómo seleccionar un archivo de video o película de UIImagePickerController

-(void)viewDidLoad{ 

    [super viewDidLoad]; 

    self.imgPicker = [[UIImagePickerController alloc] init]; 
    self.imgPicker.delegate = self; 
    self.imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
    self.imgPicker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeMovie, (NSString *)kUTTypeImage, nil]; 
    self.imgPicker.allowsEditing = NO; 

    [self presentModalViewController:self.imgPicker animated:YES]; 
} 

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{ 

    [picker dismissModalViewControllerAnimated:YES]; 
} 


-(void)imagePickerController:(UIImagePickerController *)picker 
     didFinishPickingImage : (UIImage *)image 
       editingInfo:(NSDictionary *)editingInfo{ 

} 

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

    value = 1; 

    IMAGE_COUNTER = IMAGE_COUNTER + 1; 

    NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
    if ([mediaType isEqualToString:@"public.movie" ]) 
    { 
     NSLog(@"Picked a movie at URL %@", [info objectForKey:UIImagePickerControllerMediaURL]); 
     NSURL *url = [info objectForKey:UIImagePickerControllerMediaURL]; 
     NSLog(@"> %@", [url absoluteString]); 
    } 

    else 
    { 
     UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 

     NSData* imageData = UIImageJPEGRepresentation(image, 1.0); 

     NSString* incrementedImgStr = [NSString stringWithFormat: @"UserCustomPotraitPic%d.jpg", IMAGE_COUNTER]; 

     NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString* documentsDirectory = [paths objectAtIndex:0]; 

     NSString* fullPathToFile2 = [documentsDirectory stringByAppendingPathComponent:incrementedImgStr]; 
     [imageData writeToFile:fullPathToFile2 atomically:NO]; 
    } 
} 

He utilizado el código anterior para mostrar la imagen y de vídeo, cada cosa viene bien, sin embargo cuando seleccione cualquier archivo de vídeo, no se trata de UIImagePickerController Delegado Método, archivo de vídeo juega directamente, i don 't desea reproducir cualquier archivo de vídeo, cuando seleccione cualquier archivo de vídeo que debe entrar en su propiedad delegado

Respuesta

57

Seleccionar videos de la Biblioteca de iPhone no funciona en el simulador de iOS. Pruébalo en un iPhone real.

Aquí está el código para elegir video de la biblioteca de fotos de iOS que he usado en mis proyectos. Simplemente agregue el método de video del selector al botón deseado.

- (void)video { 
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
    imagePicker.delegate = self; 
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    imagePicker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie,  nil]; 

    [self presentModalViewController:imagePicker animated:YES]; 
} 


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType]; 

    if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo) { 
     NSURL *videoUrl=(NSURL*)[info objectForKey:UIImagePickerControllerMediaURL]; 
     NSString *moviePath = [videoUrl path]; 

     if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (moviePath)) { 
      UISaveVideoAtPathToSavedPhotosAlbum (moviePath, nil, nil, nil); 
     } 
    } 

    [self dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

La cadena moviepath le da la trayectoria del vídeo seleccionado que puede ser utilizado para llevar a cabo cualquier acción deseada con ese video.

¡No olvide agregar el Marco MobileCoreServices.framework a su proyecto! Luego impórtalo así:

#import <MobileCoreServices/UTCoreTypes.h> 
+1

Si usa ARC, puede comparar el tipo de medio con más facilidad. if ([mediaType isEqualToString: (__ bridge NSString *) kUTTypeMovie]) { – averydev

+0

También puede usar azúcar sintáctica para crear una matriz como esta: 'imagePicker.mediaTypes = @ [(NSString *) kUTTypeMovie, (NSString *) kUTTypeImage];' (etc., agregue tipos como desee). Misma funcionalidad, solo un poco menos tipeando.:) – Olie

+0

Gran respuesta :). Encontré eso al establecer picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; saqué solo una lista de videos y descubrí que era más útil para lo que buscaba. Tenga en cuenta que los diferentes tipos de fuente mostrarán menús diferentes (para mí, usando UIImagePickerControllerSourceTypePhotoLibrary subió mis álbumes de fotos pero luego los mostró vacíos de video) –

4

probar esto: -

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
    imagePicker.delegate = self; 
    imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
    imagePicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeMovie]; 
    NSArray *sourceTypes = [UIImagePickerController availableMediaTypesForSourceType:imagePicker.sourceType]; 
    if (![sourceTypes containsObject:(NSString *)kUTTypeMovie ]) 
    { 
     //NSLog(@"no video"); 
    } 


    [self presentModalViewController:imagePicker animated:YES]; 

en el método delegado: -

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
    { 
      NSString *type = [info objectForKey:UIImagePickerControllerMediaType]; 
      //NSLog(@"type=%@",type); 
      if ([type isEqualToString:(NSString *)kUTTypeVideo] || 
       [type isEqualToString:(NSString *)kUTTypeMovie]) 
      {// movie != video 
       NSURL *urlvideo = [info objectForKey:UIImagePickerControllerMediaURL]; 
} 
    } 
+0

Gracias Gypsa por una respuesta rápida, pero no funciona, todavía no está incluido en el método delegado, cuando selecciono una película, tengo 3 películas m4v en el simulador – user1379448

+0

, compruebe que en el archivo .h no olvidó escribir: - Gypsa

+0

He implementado que, sin embargo, todavía no hay ningún éxito, – user1379448

1

@Dinesh Kaushik's code help to with the same problem I had.

me cambió:

//NSArray * availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; 
     //imagePickerController.mediaTypes = availableMediaTypes; 

     imagePickerController.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie,  nil]; 

y sólo de esta manera, puedo ver el vídeo y seleccionarlo. extraña

-4

No utilice UIImagePicker, sólo tiene que utilizar AssetLibrary, implementar selector de vídeo personalizado, acceso a archivos de vídeo seleccionada directamente, guardar el archivo de vídeo y compess el archivo si quieres ..

+6

¿Por qué reinventar la rueda cuando Apple ya lo hizo? Hoy todos tenemos que apresurarnos y muchos de nosotros estamos permanentemente en un horario apretado. ¡Así que usar el 'UIImagePickerController' listo para implementar es definitivamente una buena práctica! Como gran ventaja, los usuarios están familiarizados con este selector. –

0

Swift 3 actualización:

func galleryVideo() 
{   
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.savedPhotosAlbum) { 

     let videoPicker = UIImagePickerController() 
     videoPicker.delegate = self 
     videoPicker.sourceType = .photoLibrary 
     videoPicker.mediaTypes = [kUTTypeMovie as String] 
     self.present(videoPicker, animated: true, completion: nil) 
    } 
} 

importación MobileCoreServices importación y delegados añadiendo UIImagePickerControllerDelegate y UINavigationControllerDelegate.

Cuestiones relacionadas