在ios中缓存video

我有以下方法在AVMediaPlayerController上播放video

-(void)sendRequestForVideo { NSString*VideoStr=@"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"; NSURL *url = [NSURL URLWithString:VideoStr]; AVPlayer *player = [AVPlayer playerWithURL:url]; AVPlayerViewController *controller = [[AVPlayerViewController alloc]init]; controller.player = player; [self addChildViewController:controller]; [self.view addSubview:controller.view]; controller.view.frame = self.view.frame; [player play]; } 

我想缓存这里播放的video,就像我们缓存图像一样,但我无法缓存它而不理解我应该如何移动来实现这一点,因为有很多东西都依赖于AVfoundation frammework。请给出一些关于video如何可以提出的建议存储在nsurl缓存中。提前谢谢!

有直接的方法是使用NSUrlSession下载video,并使用内置缓存系统来保存video数据。 您可以查看此SO 答案中的详细信息。 但是这样你实际上是两次下载video并重新使用它。 因此,您最终可能会使用来自用户手机的更多数据。

另一种使用AVAssetExportSession并将播放的video保存到文件系统并在需要时重复使用的方法。

目标C.

 AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality]; exporter.outputURL = exportUrl; // consider you have a export url [exporter exportAsynchronouslyWithCompletionHandler:^{ // here your file will be saved into file system }]; 

迅速

 let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality) let filename = "filename.mp4" let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).last! let outputURL = documentsDirectory.URLByAppendingPathComponent(filename) exporter?.outputURL = outputURL exporter?.outputFileType = AVFileTypeMPEG4 exporter?.exportAsynchronouslyWithCompletionHandler({ print(exporter?.status.rawValue) print(exporter?.error) }) 

AVAssetExportSession的帮助下,我们实际上正在重新使用播放的video,因此用户手机数据不会被浪费,我们也很容易重复使用。 请查看以下文档链接以更好地了解

  • AVAssetExportSession
  • exportAsynchronously(completionHandler 🙂