播放存储在Core Data中的NSData视频

时间:2015-10-06 18:00:52

标签: ios xcode core-data mpmovieplayercontroller nsdata

我正在尝试播放存储在Core数据中的视频。获取后显示,有一个对象和objects.video返回一个值,但dataString打印出来为null。我不确定我做错了什么。这是播放视频的正确方式还是我可以做得更好?

我在Core Data中有单个对象。

我已将核心数据中的视频存储为NSData。我想获得存储的视频和播放。还有其他方法吗?

_context =  [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Activity" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];
// Specify how the fetched objects should be sorted
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"level"
                                                               ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];


NSError *error = nil;
NSArray *fetchResults = [_context executeFetchRequest : fetchRequest error : &error];
if(fetchRequest == nil){
    NSLog(@"Nothing fetched");
}


for (Activity *objects in fetchResults){

    NSLog(@"%@",objects.video);
  prints->  External Data Reference: <self = 0x7bf48750 ; path = FF54B18E-10B3-4B04-81D4-55AC5E2141B9 ; length = 504426>


NSString *dataString = [[NSString alloc] initWithData:objects.video encoding:NSUTF8StringEncoding];
    NSLog(@"%@",dataString);
    NSURL *movieURL = [NSURL URLWithString:dataString];
    NSLog(@"%@",movieURL);
    _moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    [_moviePlayer.view setFrame:CGRectMake (20, 20, 200 , self.view.bounds.size.height/2)];
    [self.view addSubview:_moviePlayer.view];
    [_moviePlayer play];

}
NSLog(@"%i",fetchResults.count);

1 个答案:

答案 0 :(得分:2)

它只是托管对象的二进制属性。您调用该属性并返回NSData。从那里你可以用NSData做任何你想做的事情,而它是记忆。您的问题是,您无法将NSData转换为NSURLNSURL是对NSData是实际数据的数据的引用。

您需要做的是将视频文件存储在SQLite文件之外的磁盘上。然后在Core Data中存储对它的引用(也称为url)。这样您就可以将视频文件与电影播放器​​一起使用。

正如其他人所说,将视频存储在SQLite文件中是一个坏主意。它将破坏Core Data的性能。

更新1

  

感谢。我没有将视频直接保存到核心数据,而只是复制了视频网址并将其保存为核心数据中的字符串。每当我创建用户使用的视频副本时,我是否应该为应用创建不同的文件夹以存储视频,即使他们删除了上传到核心数据的原始视频,该副本仍保持完整,从而保持对象的完整性在核心数据中。

您的评论不清楚。根据您的问题,您将实际视频存储在Core Data中。根据您显示的输出,您将文件存储在Core Data中。你改变了吗?如果是这样,您应该将视频文件存储在已知位置,并将相对 URL作为字符串存储在核心数据中的该位置。然后,在准备好使用它时,从中构建完整的URL。由于沙盒可以更改,因此无法存储整个URL,因为它将过时。