目标 C语言 获取视频路径的选取器



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

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

谢谢!

最新更新