Как выбрать любой файл видео или фильма из UIImagePickerController

В моем приложении мне нужно выбрать любой видеофайл и показать на экране URL для видеофайла в приложении.

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

Я использовал приведенный выше код для отображения изображения и видео, все идет хорошо, однако, когда я выбираю любой видеофайл, он не подходит к методу делегата UIImagePickerController, видео-файл воспроизводится напрямую, я не хочу воспроизводить любое видео файл, когда я выбираю любой видео файл, он должен прийти в свойстве делегата

Ответы на вопрос(5)

просто используйте assetlibrary, реализуйте пользовательский видео-подборщик, получите доступ к выбранному видео-файлу напрямую, сохраните видео-файл и, если хотите, запустите файл.

 03 июл. 2015 г., 20:13
Зачем изобретать велосипед, когда Apple уже сделала это? Сегодня нам всем нужно поторопиться, и многие из нас постоянно работают в сжатые сроки. Таким образом, используя готовый реализованныйUIImagePickerController это определенно хорошая практика! Как большой плюс пользователи хорошо знакомы с этим сборщиком.

Я изменился :

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

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

и только так я могу посмотреть видео и выбрать его. странный

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

Импортироватьimport MobileCoreServices и добавление делегатовUIImagePickerControllerDelegate а такжеUINavigationControllerDelegate .

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

В методе делегата: -

 - (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];
}
    }
 07 мая 2012 г., 13:00
проверьте, что в .h файле вы не забыли написать: - & lt; UIImagePickerControllerDelegate, UINavigationControllerDelegate & gt;
 user137944807 мая 2012 г., 12:46
Спасибо Gypsa за быстрый ответ, однако он не работает, он все еще не подходит для метода делегата, при выборе любого фильма у меня есть 3 m4v фильмы в симуляторе
 user137944807 мая 2012 г., 13:21
Я понял, что, тем не менее, никакого успеха пока нет,
 23 мая 2016 г., 18:42
ЛиcontainsObject: метод работы, если я, например,[((NSString *) kUTTypeVideo) copy]?
Решение Вопроса

уйте это на настоящем iPhone.

Вот код для выбора видео из библиотеки фотографий iOS, который я использовал в своих проектах. Просто добавьте метод видео из селектора на нужную кнопку.

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

Строкаmoviepath  дает вам путь к выбранному видео, которое можно использовать для выполнения любого желаемого действия с этим видео.

Не забудьте добавитьMobileCoreServices.framework Рамки к вашему проекту! Затем импортируйте это так:

#import <MobileCoreServices/UTCoreTypes.h>
 14 мая 2014 г., 18:25
Вы также можете использовать синтаксический сахар для создания массива следующим образом:imagePicker.mediaTypes = @[(NSString *)kUTTypeMovie, (NSString*) kUTTypeImage]; (и т. д., добавляйте типы по желанию.) Та же функциональность, чуть меньше набора текста. :)
 05 мая 2014 г., 21:34
Если вы используете ARC, вы можете легко сравнить тип носителя. if ([mediaType isEqualToString: (__ bridge NSString *) kUTTypeMovie]) {
 15 апр. 2015 г., 02:08
Вы должны подать радар о том, что видео не работает в библиотеке фотографий в симуляторе. Несообщаемые ошибки не исправляются;)
 14 июл. 2014 г., 06:45
Отличный ответ :). Я обнаружил, что установив picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; поднял только список видео и нашел, что это было более полезно для того, что я был после. Имейте в виду, что разные типы источников будут отображать разные меню (для меня, используя UIImagePickerControllerSourceTypePhotoLibrary, я поднял фотоальбомы, но затем отобразил их без видео)

Ваш ответ на вопрос