应用重启后 AVPlayer playerWithURL 不工作

AVPlayer playerWithURL not working after app restart

我正在从用户照片库中选择一个视频,然后将视频保存在用户的文档文件夹中,以便即使用户从他的照片库中删除该视频也能播放该视频。此文件的 URL 存储在核心数据中。 一切正常,直到下次我 运行 应用程序。不知何故,URL 似乎不再有效,这很奇怪,因为当 [AVPlayer playerWithURL:videoURL] 失败时我可以删除视频文件。 这是我选择视频的方式 URL:

- (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];

非常感谢!

The URL to this file is stored in Core Data

这就是问题所在。每次您 运行 应用程序时,文档目录 URL 都会更改(因为您是沙盒),因此第二次无效。 Never never never never save an absolute file URL in iOS!

每次关闭和打开应用程序时都需要获取路径目录,因为当应用程序关闭它时会删除文档目录,所以你必须再次获取,如果你想获得你的视频文件然后保存该视频的文件名 到首选项或 核心数据 然后通过附加此视频名称文件获取 documentDirectory 路径,您将获得您的视频。

看看: - (代码在swift可以转换objective 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

FILE NAME 您将保存在首选项或 coreData

当您关闭并打开应用程序时,只需检查您是否将文件名保存在首选项或核心数据中,如果是,然后通过附加 documentsDirectory 获取它,您将获得您的视频