在我的应用程序中,我允许用户录制视频,并将它们保存在以下路径中:
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 存储库)。
我不想允许用户播放视频,我只想要视频路径,这种方法可以吗?
我还可以在
NSSearchPathForDirectoryInDomains
有了这个:
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,是否可以轻松创建具有缩略图,持续时间等的自定义视频选择器。
感谢您的帮助
UIImagePickerController
是iOS照片应用程序的一个实例,您可以通过它访问设备图库中的所有照片/视频,而不仅仅是属于您的应用程序的照片/视频。无法让UIImagePickerController
仅显示您的应用程序录制的视频。在选取文件时,UIImagePickerController
也不可能跳过"播放/选择"步骤。
就像您提到的,您绝对可以通过NSFileManager
将视频文件写入应用程序文档目录,并保留对路径的引用,以供以后使用。 我认为您最终可能会创建一个具有以下属性的模型类,例如"视频";
a) 保存路径b) 持续时间c) 缩略图等
然后,可以使用类似 NSKeyedArchiver
的内容对这些对象进行编码并存储到文件中,以便以后可以检索此信息。
我终于使用自定义选择器找到了解决方案:
-
要获取本地视频列表,请执行以下操作:
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);
谢谢!