2012-05-07 10 views
24

W mojej aplikacji muszę wybrać dowolny plik wideo i wyświetlić ekran URL pliku wideo w aplikacji.Jak wybrać dowolny plik wideo lub filmu z 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]; 
    } 
} 

Użyłem powyższy kod do wyświetlania obrazu i wideo, wszystko idzie dobrze, jednak kiedy wybrać dowolny plik wideo, to nie chodzi o UIImagePickerController Delegata metodzie plików wideo bezpośrednio odgrywa, i don „t chcesz odtwarzać dowolny plik wideo, po zaznaczeniu dowolnego pliku wideo powinno pochodzić w jego właściwość delegata

Odpowiedz

57

Pobieranie filmów z biblioteki iPhone'a nie działa na symulatorze systemu iOS. Wypróbuj na prawdziwym iPhonie.

Oto kod do wybierania wideo z Biblioteki zdjęć iOS, z której korzystałem w moich projektach. Po prostu dodaj metodę wideo z selektora do wybranego przycisku.

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

Ciąg moviepath daje ścieżkę wybranego pliku wideo, który można stosować do wykonywania dowolnej czynności z tym filmem.

Nie zapomnij dodać do swojego projektu struktury MobileCoreServices.framework Framework! Następnie zaimportuj go w ten sposób:

#import <MobileCoreServices/UTCoreTypes.h> 
+1

Jeśli używasz ARC, możesz łatwiej porównać rodzaj multimediów. if ([mediaType isEqualToString: (__ bridge NSString *) kUTTypeMovie]) { – averydev

+0

Możesz również użyć cukru syntaktycznego do utworzenia tablicy w następujący sposób: 'imagePicker.mediaTypes = @ [(NSString *) kUTTypeMovie, (NSString *) kUTTypeImage];' (itp., dodaj typy według potrzeb.) Ta sama funkcjonalność, tylko trochę mniej pisania.:) – Olie

+0

Świetna odpowiedź :). Znalazłem to ustawiając picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; wyświetlił tylko listę filmów i stwierdził, że jest bardziej przydatny do tego, o co prosiłem. Pamiętaj, że różne typy źródeł będą wyświetlać różne menu (dla mnie za pomocą UIImagePickerControllerSourceTypePhotoLibrary wyświetlają moje albumy ze zdjęciami, ale wyświetlają je puste) –

4

spróbuj tego: -

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]; 

w metodzie delegata: -

- (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

Dzięki Gypsa za szybką odpowiedź, ale nie działa, nadal nie wchodzi w tryb delegowania, po wybraniu dowolnego filmu, mam 3 filmy m4v w Symulatorze – user1379448

+0

sprawdź, czy w pliku .h nie zapomniałeś napisać: - Gypsa

+0

Zaimplementowałem to, ale jeszcze nie ma żadnego sukcesu, – user1379448

1

@ Kod Dineh Kaushika pomaga w tym samym problemie, który miałem.

zmieniłem:

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

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

i tylko w ten sposób mogę zobaczyć film i wybrać ją. dziwne

-4

Nie używaj UIImagePicker, wystarczy użyć AssetLibrary, wdrożyć niestandardowy selektor wideo, dostęp do wybranego pliku wideo bezpośrednio, zapisać plik wideo i compess plik, jeśli chcesz ..

+6

Po co wymyślać na nowo koło, kiedy Apple już to zrobił? Dziś wszyscy musimy się spieszyć i wielu z nas jest na bardzo napięty harmonogram. Tak więc używanie gotowego zaimplementowanego 'UIImagePickerController' jest zdecydowanie dobrą praktyką! Jako wielki plus użytkownicy dobrze znają ten selektor. –

0

Swift 3 zmiana:

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) 
    } 
} 

importu import MobileCoreServices i dodanie delegaci UIImagePickerControllerDelegate i UINavigationControllerDelegate.

Powiązane problemy