这两天在写视频的东西,然后就在网上找了很多资料。
找到觉得比较适合自己需求(边看边下载,离线缓存)的一个demo:
<a href = "//www.greatytc.com/p/57cf45834e7f">基于AVPlayer封装视频播放器(具有边下边播、离线缓存、自定义控制面板等功能)</a>
但是作者里面用到的下载的类的封装不是很好,这时我就找到了<a href = "https://github.com/HHuiHao/HSDownloadManager">HSDownloadManager</a>
然后利用这两个demo进行优化,下面来说说我优化的东西:
1、在LYPlayerDemo中,我放弃了它是下载文件:
然后引入了HSDownloadManager。
2、修改HSDownloadManager里的保存路径,因为我发现它保存是没有后缀名的,这样就导致了很多视频下载下来但是从本地获取就播放不了了。
// 保存文件名
//#define HSFileName(url) url.md5String
#define HBFileName(url) [[url componentsSeparatedByString:@"."] lastObject]
#define HBFirstName(url) [[url componentsSeparatedByString:@"."] firstObject] .md5String
#define HSFileName(url) [NSString stringWithFormat:@"%@.%@",HBFirstName(url),HBFileName(url)]
3、在LYVideoPlayer.m的文件里修改一下内容:
//下载
[[HSDownloadManager sharedInstance] download:videoUrl progress:^(NSInteger receivedSize, NSInteger expectedSize, CGFloat progress) {
dispatch_async(dispatch_get_main_queue(), ^{
NSString * progressStr = [NSString stringWithFormat:@"%.f%%", progress * 100];
//进度
NSLog(@"progress:%@",progressStr);
});
} state:^(DownloadState state) {
dispatch_async(dispatch_get_main_queue(), ^{
NSString *str = [self getTitleWithDownloadState:state];
NSLog(@"下载情况:%@",str);
});
}];
//判断一下
NSURL *url = [[NSURL alloc]init];
//判断一下有没有下载完毕
if ([[HSDownloadManager sharedInstance] isCompletion:videoUrl]) {
//下载成功
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:HSFileFullpath(videoUrl)]) {
url = [NSURL fileURLWithPath:HSFileFullpath(videoUrl)];
NSLog(@"已经下载成功了的");
NSLog(@"下载完成的路径:%@",HSFileFullpath(videoUrl));
}
}
else{
//下载失败
NSString *filePath = [videoUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
url = [NSURL URLWithString:filePath];
NSLog(@"还没有下载的url:%@",url);
}
//播放
[self getUrlToPlayVideo:url];
4、判断下载好的视频是否有效,如果无效,那么把文件删除
NSLog(@"======== 播放失败");
//可能下载的文件不可读取,所以移除之前的文件
[[HSDownloadManager sharedInstance] deleteFile:self.videoUrl];
这是我修改后的demo,赶时间的小伙伴们可以直接拿来用:<a href = "https://github.com/smileKH/HBVideoPlayer">HBVideoPlayer</a>
END.