我有以下方法在 AVMediaPlayerController 上播放视频
-(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];
}
我想缓存在这里播放的视频,就像我们缓存图像一样,但我无法缓存它并且不明白我应该如何移动才能实现这一目标,因为与 AVfoundation frammework 相关的东西太多了。请提出一些建议如何将视频存储在 nsurl 缓存中。提前致谢!
最佳答案
直接的方法是使用 NSUrlSession
下载视频并使用内置缓存系统来保存视频数据。您可以查看此 SO 中的详细信息 answer .但通过这种方式,您实际上是在下载视频两次并重新使用它。因此,您最终可能会使用更多来自用户手机的数据。
另一种使用 AVAssetExportSession
的方法,将播放的视频保存到文件系统中,并在需要时重新使用。
objective-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
}];
swift
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
的帮助下,我们实际上是在重复使用播放的视频,这样用户手机数据就不会被浪费,而且我们也很容易重复使用。查看以下文档链接以更好地理解
关于ios - 在 ios 中缓存视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44022396/