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】:
UIImagePickerController
是 ios 照片应用程序的一个实例,您可以通过它访问设备库中的所有照片/视频,而不仅仅是属于您的应用程序的照片/视频。没有办法让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)
如何在iOS Objective c中从没有文件名的目录中获取文件路径