应用程序重启后AVPlayer playerWithURL无法正常工作

时间:2017-09-29 18:17:39

标签: objective-c avplayer nsurl

我正在从用户照片库中选择一个视频,而不是将视频保存在用户文档文件夹中以便能够播放视频,即使用户从他的照片库中删除了该视频也是如此。此文件的URL存储在Core Data中。 一切正常,直到下次我运行App。不知何故,似乎URL不再有效,这很奇怪,因为我能够在[AVPlayer playerWithURL:videoURL]失败时删除视频文件。 以下是我选择视频网址的方法:

- (void) imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
NSURL* videoURL = info[UIImagePickerControllerMediaURL];}

这就是我保存视频的方式:

+ (NSURL*) saveVideoInDocumentsFolder:(NSURL*)videoURL name:(NSString*)name {
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
NSString* pathComponent = [NSString stringWithFormat:@"/%@.%@", name, [videoURL pathExtension]];
NSString* path = [documentsDirectory stringByAppendingPathComponent:pathComponent];

NSError* error = nil;
NSData* videoData = [NSData dataWithContentsOfURL:videoURL options:0 error:&error];
if (error)
    return nil;

BOOL success = [videoData writeToFile:path options:NSDataWritingAtomic error:&error];
if (success)
    return [NSURL fileURLWithPath:path];

return nil;}

这是我播放视频的方式:

AVPlayer* player = [AVPlayer playerWithURL:videoURL]; // <- AFTER I RESTART THE APP THIS METHOD ALWAYS RETURNS nil!!

AVPlayerViewController* viewController = [[AVPlayerViewController alloc] init];
[self presentViewController:viewController animated:YES completion:nil];
viewController.player = player;
[player play];

非常感谢提前!

2 个答案:

答案 0 :(得分:0)

  

此文件的URL存储在Core Data

这就是问题所在。每次运行应用程序时,文档目录URL都会更改(因为您是沙箱),因此第二次无效。永远不要永远不会在iOS中保存绝对文件URL!

答案 1 :(得分:0)

当关闭并打开应用程序时,你需要在路径目录中占用时间,因为当应用程序关闭它时会删除documentDirectory,因此你必须再次使用它,如果你想获取你的视频文件,那么保存文件名称该视频到首选项或coreData然后通过附加此视频名称文件获取documentDirectory路径,您将获得您的视频。

看看: - (代码很快你可以很容易地将它转换为目标c)

让fileName =“recording.mp4”

让tempPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,FileManager.SearchPathDomainMask.userDomainMask,true)

将tempDocumentsDirectory:AnyObject = tempPath [0]设为AnyObject

让tempDataPath = tempDocumentsDirectory.appendingPathComponent(fileName)as String as String

您将保存优先级或coreData的文件名

当您关闭并打开应用程序时,只需检查您是否有优先保存文件名或核心数据,如果是,则通过附加documentsDirectory来获取它,您将获得视频