如何从UIImagePickerController中选择任何视频或电影文件

32
在我的应用程序中,我需要选择任何视频文件并在应用程序中显示该视频文件的URL。
-(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];
    }
}
我使用了上面的代码来展示图片和视频,一切都正常,但是当我选择任何视频文件时,它没有出现在UIImagePickerController委托方法中,视频文件直接播放,我不想播放任何视频文件,当我选择任何视频文件时,它应该出现在其委托属性中。
5个回答

67

在 iOS 模拟器上无法从 iPhone 图库中选择视频。请在真正的 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>

1
如果您正在使用ARC,您可以更容易地比较媒体类型。 if ([mediaType isEqualToString:(__bridge NSString *)kUTTypeMovie]) { - averydev
你也可以使用语法糖来创建数组,像这样:imagePicker.mediaTypes = @[(NSString *)kUTTypeMovie, (NSString*) kUTTypeImage]; (等等,根据需要添加类型)。相同的功能,只需少打几个字。 :) - Olie
很棒的答案:)。我发现通过设置picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 只会弹出视频列表,对我来说更有用。请记住,不同的源类型将显示不同的菜单(对我来说,使用UIImagePickerControllerSourceTypePhotoLibrary 弹出了我的照片相册,但是却没有显示视频)。 - sam_smith
你应该在模拟器中关于照片库中视频无法正常工作的问题提交一个报告。未报告的错误将不会得到修复 ;) - Jeremy Huddleston Sequoia

7

尝试这个:

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

感谢Gypsa的快速回复,但是它还没有起作用,当我选择任何电影时,它仍然没有出现在委托方法下,在模拟器中有3个m4v电影。 - user1379448
请检查.h文件中是否忘记写上以下内容:- <UIImagePickerControllerDelegate,UINavigationControllerDelegate> - Gypsa
我已经实现了,但是还没有取得任何成功。 - user1379448
如果我这样做 [((NSString *) kUTTypeVideo) copy]containsObject: 方法还能正常工作吗? - Alejandro Iván
使用 import MobileCoreServices 来获取 kUTTypeVideo - dinesh sharma

3

Swift 3 更新:

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

导入 MobileCoreServices 并添加代理 UIImagePickerControllerDelegateUINavigationControllerDelegate


1
"

@Dinesh Kaushik的代码帮助我解决了同样的问题。

我修改了:

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

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

只有这种方式,我才能看到视频并选择它。奇怪。


-5
不要使用UIImagePicker,只需使用assetlibrary,实现自定义视频选择器,直接访问所选视频文件,保存视频文件并在需要时压缩文件。

9
为什么要造轮子,当苹果已经做过了?今天,我们都需要赶时间,许多人的日程安排非常紧张。因此,使用现成实现的 UIImagePickerController 绝对是一个好习惯!而且,用户对这个选择器很熟悉,这也是一个很大的优点。 - Julian F. Weinert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接