Objective c - 获取视频路径的选择器

Posted

技术标签:

【中文标题】Objective c - 获取视频路径的选择器【英文标题】:Objective c - picker to get video path 【发布时间】:2016-01-26 11:38:38 【问题描述】:

在我的应用中,我允许用户录制视频并将它们保存在此路径中:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths[0] stringByAppendingPathComponent:DestFileName];

我想在我的应用中实现一个视频选择器,但目标是获取视频的路径。我从这样的基本方法开始:

UIImagePickerController *videoPicker = [[UIImagePickerController alloc] init];
videoPicker.delegate = self;
videoPicker.modalPresentationStyle = UIModalPresentationCurrentContext;
videoPicker.mediaTypes =[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];‌​
videoPicker.mediaTypes = @[(NSString*)kUTTypeMovie, (NSString*)kUTTypeAVIMovie, (NSString*)kUTTypeVideo, (NSString*)kUTTypeMPEG4];
videoPicker.videoQuality = UIImagePickerControllerQualityTypeHigh;
[self presentViewController:videoPicker animated:YES completion:nil];

第一个问题是我无法访问我录制的视频,为什么? 然后,这个选择器允许用户播放视频,当我选择一个视频时,我认为创建了一个压缩视频并将其发送到我们的委托方法(URL 转到 tmp 存储库)。

我不想让用户播放视频,我只想要视频路径,这种方法可以吗?

我也可以得到文件列表

NSSearchPathForDirectoriesInDomains

用这个:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *rootPath = path[0];
[[NSFileManager defaultManager] createDirectoryAtPath:rooPath withIntermediateDirectories:YES attributes:nil error:nil];
NSArray* mPaths = [[NSFileManager defaultManager] contentOfDirectoryAtPath:rootPath error:nil];

使用这种方法,我可以找到我录制的视频,但是我必须实现自己的自定义选择器,但实现起来可能很困难且耗时(例如需要获取缩略图,可能吗?)。

总结一下:

使用 UIImagePickerController,是否可以阻止播放,只获取路径并显示我们录制的视频? 使用 NSFileManager,是否可以轻松创建带有缩略图、持续时间等的自定义视频选择器)

感谢您的帮助

【问题讨论】:

只是我的看法,但是在阅读了这篇冗长的帖子之后,我觉得这两个问题真的应该作为两个单独的问题来问...... videoPicker.mediaTypes 设置两次?你没有覆盖值吗? 【参考方案1】:

UIImagePickerControllerios 照片应用程序的一个实例,您可以通过它访问设备库中的所有照片/视频,而不仅仅是属于您的应用程序的照片/视频。没有办法让UIImagePickerController 只显示您的应用程序录制的视频。也不能让UIImagePickerController 在选择文件时跳过播放/选择步骤。

正如您提到的,您绝对可以通过NSFileManager 将视频文件写入应用程序文档目录,并保留对路径的引用,以供以后使用。我认为您最终可能会创建一个具有以下属性的模型类,例如“视频”;

a) 保存路径 b) 持续时间 c) 缩略图等

然后您可以使用NSKeyedArchiver 之类的东西对这些对象进行编码并存储到一个文件中,以便您以后可以检索这些信息。

【讨论】:

【参考方案2】:

我终于找到了使用自定义选择器的解决方案:

获取本地视频列表:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* rootPath = paths[0];
[[NSFileManager defaultManager] createDirectoryAtPath:rootPath withIntermediateDirectories:YES attributes:nil error:nil];
NSArray* mPaths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:rootPath error:nil];

要获取持续时间和缩略图:

NSURL *videoURl = [NSURL fileURLWithPath:mPath];
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURl options:nil];
AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generate.appliesPreferredTrackTransform = YES;
NSError *err = NULL;
CMTime time = CMTimeMake(1, 60);
CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
UIImage *img = [[UIImage alloc] initWithCGImage:imgRef];
[m_videoFrames addObject:img];
CMTime duration = [asset duration];
int seconds = ceil(duration.value/duration.timescale);

谢谢!

【讨论】:

以上是关于Objective c - 获取视频路径的选择器的主要内容,如果未能解决你的问题,请参考以下文章

获取我在 photoLibrary iOS Objective-c 中选择的视频的位置元数据

从 imagePicker 获取本地文件路径(iOS,Objective C)

从Objective C中的NSBundle获取图像路径?

如何在iOS Objective c中从没有文件名的目录中获取文件路径

Swift与Objective-CCC++混合编程-关东升-专题视频课程

Objective C 连接键