基于AVPlayer和HSDownloadManager封装视频播放器

这两天在写视频的东西,然后就在网上找了很多资料。

找到觉得比较适合自己需求(边看边下载,离线缓存)的一个demo:
基于AVPlayer封装视频播放器(具有边下边播、离线缓存、自定义控制面板等功能)

但是作者里面用到的下载的类的封装不是很好,这时我就找到了HSDownloadManager

然后利用这两个demo进行优化,下面来说说我优化的东西:

1、在LYPlayerDemo中,我放弃了它是下载文件:

图片发自.png

然后引入了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,赶时间的小伙伴们可以直接拿来用:HBVideoPlayer

END.

你可能感兴趣的:(基于AVPlayer和HSDownloadManager封装视频播放器)