AVPlayer playerWithURL在应用重启后无法工作。

问题描述 投票:0回答:2

我从用户的照片库中挑选了一个视频,然后我将视频保存在用户的文档文件夹中,即使用户从他的照片库中删除了这个视频,也能播放该视频。这个文件的URL存储在Core Data中,一切都很好,直到我下一次运行应用程序。不知何故,似乎这个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];

非常感谢!

objective-c avplayer nsurl
2个回答
1
投票

这个文件的URL存储在核心数据中。

这就是问题所在。每次运行应用时,文件目录URL都会改变(因为你被沙盒了),所以第二次就无效了。在iOS中,千万千万不要保存绝对的文件URL!


0
投票

你需要在每次关闭和打开应用程序的时候取下路径目录,因为当应用程序关闭时,它将删除documentDirectory,所以你必须在另一次取下它,如果你想获得你的视频文件,那么就保存这个路径。文件名 的视频进入偏好或 核心数据 然后得到documentDirectory路径,通过附加这个视频名称文件,你会得到你的视频。

只是有一个看看。 - (代码是在 迅速 您可以将其转换为 目标c (容易)

let fileName = "recording.mp4"

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

let tempDocumentsDirectory: AnyObject = tempPath[0] as AnyObject

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

文件名 您将保存在偏好或核心数据中

当你关闭并打开应用程序时,只需检查你有文件名保存在首选项或核心数据,如果是,然后采取它的附加文件Directory,你会得到你的视频。

© www.soinside.com 2019 - 2024. All rights reserved.