基于AVPlayer播放器實現(xiàn)(MJPlayer)二.緩存

Round 2----->緩存功能實現(xiàn)

在interface中添加下載按鈕

@property (nonatomic,strong) UIButton* downLoadBtn;                      //下載按鈕

按照之前的步驟,在initMJPlayerFrame中對添加的控件進行布局莉御,并添加手勢來對控制界面進行顯示隱藏操作

 /*界面 ROUND 2********************************************************************************************/
    self.downLoadBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.downLoadBtn setImage:[UIImage imageNamed:@"MJPlayer_download"] forState:UIControlStateNormal];
    [self.downLoadBtn setImage:[UIImage imageNamed:@"MJPlayer_not_download"] forState:UIControlStateSelected];
    [self.downLoadBtn addTarget:self action:@selector(downLoadBtnPress:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:self.downLoadBtn];
    [self.downLoadBtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.equalTo(self);
        make.right.equalTo(self).offset(-20);
        make.height.equalTo(@(49));
        make.width.equalTo(@(40));
    }];
    
    //添加手勢
    singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(singleTap:)];
    [singleTapGestureRecognizer setNumberOfTapsRequired:1];
    [self addGestureRecognizer:singleTapGestureRecognizer];
    //延遲隱藏控制界面
    [self showAndHideControl:0];
//顯示隱藏控制界面
-(void)showAndHideControl:(NSInteger)alphaNum
{
    __weak typeof (self)self_ = self;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [UIView animateWithDuration:0.2f animations:^{
            self_.bottomControlView.alpha = alphaNum;
            self_.downLoadBtn.alpha = alphaNum;
        }];
    });
}
-(void)singleTap:(UITapGestureRecognizer*)tapGesture
{
    __weak typeof (self)self_ = self;
    [UIView animateWithDuration:0.2f animations:^{
        self_.bottomControlView.alpha = 1;
        self_.downLoadBtn.alpha = 1;
    } completion:^(BOOL finished) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [UIView animateWithDuration:0.2f animations:^{
                self_.bottomControlView.alpha = 0;
                self_.downLoadBtn.alpha = 0;
            }];
        });
    }];
}

在項目中新建一個下載類 MJDownLoad繼承于NSObject恃鞋,使用單例創(chuàng)建對象规惰,聲明下載方法及本地方法袖订,待會在.m文件中實現(xiàn)

MJDownLoad.h
//
//  MJDownLoad.h
//  MJAVPlayer
//
//  Created by 馬家俊 on 16/11/4.
//  Copyright ? 2016年 MJJ. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <AFNetworking.h>

#define UserDefaults [NSUserDefaults standardUserDefaults]
#define GetFileName  [[strUrl stringByReplacingOccurrencesOfString:@"/" withString:@""]  stringByReplacingOccurrencesOfString:@"." withString:@""]
@interface MJDownLoad : NSObject
/*!單例模式獲取MJDownLoad對象
 *\\returns  returns:        返回ParkApply對象
 */
+ (MJDownLoad *)shareInstanceManager;

/*!獲取url進行下載
 */
-(void)downLoadWithUrl:(NSString*)strUrl;

/*!獲取本地url
 *\\returns  returns:        返回NSString 本地URL或者空字符串
 */
-(NSString*)getLocalVedio:(NSString*)strUrl;
@end

MJDownload單例

static MJDownLoad *g_MJDownLoad;
+ (MJDownLoad *)shareInstanceManager
{
    @synchronized(self)
    {
        if (!g_MJDownLoad)
        {
            g_MJDownLoad = [[MJDownLoad alloc] init];
        }
    }
    return g_MJDownLoad;
}

downLoad方法德撬,使用的是 downloadTaskWithRequest,獲取URL后先去cache中查看是否有
VedioCache這個文件夾固歪,如果沒有則直接代碼創(chuàng)建該文件夾蒜鸡,之后進行下載

-(void)downLoadWithUrl:(NSString*)strUrl
{
    //獲取cache路徑,該文件夾中的文件不會被同步牢裳,清楚緩存直接刪除該文件夾下所有子文件即可
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES) ;
    NSString *documentsDire = [paths objectAtIndex:0];
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //以獲取到的視頻文件名稱作為存儲文件名
    NSString *fileName = GetFileName;
    NSString *fileNameWithMP4 = [fileName stringByAppendingString:@".mp4"];
    NSFileManager *fileManager = [[NSFileManager alloc] init];

    //查看是否有該路徑逢防,如果沒有則創(chuàng)建
    NSString* createPath = [NSString stringWithFormat:@"%@/VedioCache/%@", documentsDire,fileName];
    if (![[NSFileManager defaultManager] fileExistsAtPath:createPath])
    {
        [fileManager createDirectoryAtPath:createPath withIntermediateDirectories:YES attributes:nil error:nil];
    }else
    {
        NSLog(@"FileDir is exists.");
    }

    //視頻緩存最終路徑
    NSString *fullPath = [NSString stringWithFormat:@"%@/%@",createPath,fileNameWithMP4];
    NSURL *url = [NSURL URLWithString:strUrl];
    NSURLRequest *requst = [NSURLRequest requestWithURL:url];

    //開啟下載任務
    NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:requst progress:nil destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        return [NSURL fileURLWithPath:fullPath];
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        [UserDefaults setObject:fullPath forKey:fileName];
        UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"下載完成!" delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
        [alert show];
    }];
    [task resume];
}

下載完成后獲取下載文件蒲讯,存在該文件則返回路徑忘朝,否則返回空字符串

-(NSString*)getLocalVedio:(NSString *)strUrl
{
    NSString* localUrl = [UserDefaults objectForKey:GetFileName];
    if (localUrl) {
        return localUrl;
    }else
    {
        return @"";
    }
}

完成MJDownLoad之后要對MJPlayerView進行調(diào)整,讓player可以在本地存在緩存時不再請求網(wǎng)絡數(shù)據(jù)
在initMJPlayer這個方法中判帮,對playerItem進行初始化的時候去判定是否存在本地緩存局嘁,存在則用本地緩存去初始化溉箕,否則正常流程

if (![[[MJDownLoad shareInstanceManager]getLocalVedio:vedioUrl] isEqualToString:@""]) {
        NSURL *sourceMovieUrl = [NSURL fileURLWithPath:[[MJDownLoad shareInstanceManager]getLocalVedio:vedioUrl]];
        AVAsset *movieAsset = [AVURLAsset URLAssetWithURL:sourceMovieUrl options:nil];
        self.playerItem = [AVPlayerItem playerItemWithAsset:movieAsset];
        self.downLoadBtn.selected = YES;
    }else
    {
        self.playerItem = [AVPlayerItem playerItemWithURL:videoUrl];
        [[MJDownLoad shareInstanceManager]downLoadWithUrl:vedioUrl];
    }

最后對點擊下載按鈕的事件進行實現(xiàn)

#pragma Mark----downLoadBtn下載按鈕點擊事件
-(void)downLoadBtnPress:(UIButton*)sender
{
    if(!sender.selected)
    {
        [[MJDownLoad shareInstanceManager]downLoadWithUrl:vedioUrl];
    }else
    {
        sender.userInteractionEnabled = NO;
    }
}

下載功能實現(xiàn)完成,下一步實現(xiàn)下載列表悦昵,突然發(fā)現(xiàn)有一步做的多余了肴茄,不需要用到NSUserdefault,直接組裝路徑查看是否存在該路徑即可知道是否存在緩存

未完待續(xù)--------------------------------------------------------

github:
https://github.com/AlexMJ666/MJPlayer

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末但指,一起剝皮案震驚了整個濱河市寡痰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枚赡,老刑警劉巖氓癌,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贫橙,居然都是意外死亡贪婉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門卢肃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疲迂,“玉大人,你說我怎么就攤上這事莫湘∮容铮” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵幅垮,是天一觀的道長腰池。 經(jīng)常有香客問我,道長忙芒,這世上最難降的妖魔是什么示弓? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮呵萨,結(jié)果婚禮上奏属,老公的妹妹穿的比我還像新娘。我一直安慰自己潮峦,他們只是感情好囱皿,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忱嘹,像睡著了一般嘱腥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拘悦,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天齿兔,我揣著相機與錄音,去河邊找鬼。 笑死愧驱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的椭盏。 我是一名探鬼主播组砚,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掏颊!你這毒婦竟也來了糟红?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤乌叶,失蹤者是張志新(化名)和其女友劉穎盆偿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體准浴,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡事扭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乐横。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片求橄。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖葡公,靈堂內(nèi)的尸體忽然破棺而出罐农,到底是詐尸還是另有隱情,我是刑警寧澤催什,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布涵亏,位于F島的核電站,受9級特大地震影響蒲凶,放射性物質(zhì)發(fā)生泄漏气筋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一豹爹、第九天 我趴在偏房一處隱蔽的房頂上張望裆悄。 院中可真熱鬧,春花似錦臂聋、人聲如沸光稼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艾君。三九已至,卻和暖如春肄方,著一層夾襖步出監(jiān)牢的瞬間冰垄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工权她, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虹茶,地道東北人逝薪。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蝴罪,于是被迫代替她去往敵國和親董济。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容