在 avplayer 中将 coredata 中的视频作为 nsdata 播放

Play video from coredata as nsdata in avplayer

如何在 AVPlayer 中播放来自 coredata 的视频作为 nsdata 格式? MPMoviePlayerController 已弃用,所以我将使用 AVPlayer。我正在搜索关于保存 nsdata 位置的 url 路径的一些事情,我不清楚。有人解释一下吗?怎么玩?

我是新手,如果分享该代码,我将不胜感激。

如果有人分享了自定义 AVPlayer 的好教程,我没有找到好的教程,所以从 github 示例项目中学习。

提前致谢:)

你可以试试这个!

 NSString *filePath = [self documentsPathForFileName:@"video.mp4"];

 BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath];
 if(!fileExists) {
    NSData *videoAsData;   // your data here
    [videoAsData writeToFile:filePath atomically:YES];
 }

 // access video as URL
 NSURL *videoFileURL =  [NSURL fileURLWithPath:filePath];

// create an AVPlayer
AVPlayer *player = [AVPlayer playerWithURL:videoFileURL];

// create a player view controller
AVPlayerViewController *controller = [[AVPlayerViewController alloc]init];
controller.player = player;

[self presentViewController:controller animated:YES completion:^{
    [controller.player play];
}];


- (NSString *)documentsPathForFileName:(NSString *)name
{
  NSArray *paths =     NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
  NSString *documentsPath = [paths objectAtIndex:0];

  return [documentsPath stringByAppendingPathComponent:name];
}

// if you want to remove file after playing video

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
BOOL success = [fileManager removeItemAtPath:filePath error:&error];

这里有一个 Swift 版本,介绍如何执行此操作

let data = //... your video Data/NSData
let cacheURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("yourvidename.mp4")

do {
    try data.write(to: cacheURL, options: .atomicWrite)
} catch let err {
    print("Failed with error:", err.localizedString)
}

// instantiate the player
let player = AVPlayer(url: cacheURL)
let vcPlayer = AVPlayerViewController()
vcPlayer.player = player
vcPlayer.player?.play()

// present it or add it to whatever view you need
present(vcPlayer, animated: true, completion: nil)

然后在viewWillDisappear删除cachesDirectory的内容