网上获取视频,可播放

本文介绍了如何通过网络请求下载视频,并结合2D绘图与AVPlayerViewController实现视频播放。通过故事板布局按钮,利用代理方法监听下载进度和完成状态,实现实时更新界面。同时,使用block方法获取下载进度,当下载完成后绘制完成标记。文章中还提到了播放视图的设置以及简单的图形绘制方法。
摘要由CSDN通过智能技术生成

这里写图片描述
这里写图片描述
这里写图片描述

大体思路:1.主要用到了网络的下载请求,和2D绘图以及AVPlayerViewController
2.我这里的四个按钮是用故事板上拖的,然后连接一下方法。分别是

#pragma mark - 开始下载
- (IBAction)starloadAction:(id)sender {

    //1.url
    NSURL *url = [NSURL URLWithString:self.urlStr];

    //2.创建会话
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

    session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    //3.创建任务
    task = [session downloadTaskWithURL:url];

    //绘制图层
    [self createDrawView];

    //执行任务
    [task resume];
}

#pragma mark - 暂停下载
- (IBAction)pauseloadAction:(id)sender {

    //1.暂停
    [task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {

        //保存到全局变量中,方便继续下载
        saveData = resumeData;

        //把以前的任务丢弃
        task = nil;
    }];
}
#pragma mark - 继续下载
- (IBAction)continueloadAction:(id)sender {

    task = [session downloadTaskWithResumeData:saveData];

    //(恢复)
    [task resume];
}

3.我用代理方法,监听下载的进度,和是否完成下载,使下载和绘图同步,方法是

#pragma mark - 代理方法,下载完成后
- (void) URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {

    //移动文件,不然程序结束,文件就会销毁,因为是在临时文件中,所以要转移
    NSFileManager *manager = [NSFileManager defaultManager];

    //创建新的地址
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/download.mp4"];

    NSURL *url = [NSURL fileURLWithPath:path];

    //保存地址,方便播放用
    self.saveUrl = url;

    //移动
    [manager moveItemAtURL:location toURL:url error:nil];

    //使画圆进度和下载进度同步
    [draw setMyBlock:^float{

        return 7.0;
    }];
    //下载完成后,使用block通知画图层,绘制完成图形,我这里中间是打勾的图形
    [draw setYesBlock:^BOOL{

        return YES;
    }];
    //重绘
    [draw setNeedsDisplay];

    //创建播放按钮
    [self performSelector:@selector(createPlayButton) withObject:nil afterDelay:0.5];

}
#pragma mark - 代理方法,实时掌握下载进度
- (void) URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {

    /*
        totalBytesWritten:已经下载传输的字节
        totalBytesExpectedToWrite:文件的总大小
     */
    progress += (totalBytesWritten/(float) totalBytesExpectedToWrite)/10.0;

    //实时更新进度
    if (progress < 6) {
        //避免怪圈现象
        __block float this = progress;
        [draw setMyBlock:^float() {
            return this;
        }];
        [draw setNeedsDisplay];

    }

4.播放视图的方法,创建播放按钮的就不放了

#pragma mark - 播放视频
- (void) buttonAction:(UIButton *) btn {

    //播放视图
    AVPlayerViewController *avPlayer = [[AVPlayerViewController alloc] init];

    //添加播放地址
    avPlayer.player = [AVPlayer playerWithURL:self.saveUrl];

    //手动播放
    [avPlayer.player play];

    //推送
    [self presentViewController:avPlayer animated:YES completion:nil];
}

5.然后就是绘图视图,一个画圆的方法,和三个点组成的勾勾图形

- (void) drawRect:(CGRect)rect {

    //获取上下文
    CGContextRef context = UIGraphicsGetCurrentContext();

    //画圆
    CGContextAddArc(context, (414-80)/2, 150, 80, 0,self.endY, 0);

    //设置格式
    [[UIColor whiteColor] setStroke];
    CGContextSetLineWidth(context, 3);

    //绘制
    CGContextDrawPath(context, kCGPathStroke);

    if (self.isy) {
        [self drawOk];
    }
}

- (void) drawOk {

    //获取上下文
    CGContextRef context = UIGraphicsGetCurrentContext();

    //创建路径
    CGMutablePathRef path = CGPathCreateMutable();

    //创建第一个点
    CGPathMoveToPoint(path, NULL, (414-80)/2-35, 140);
    //两个终点
    CGPathAddLineToPoint(path, NULL, (414-60)/2-25, 170);
    CGPathAddLineToPoint(path, NULL, (414+30)/2, 130);

    //设置格式
    [[UIColor greenColor] setStroke];
    CGContextSetLineWidth(context, 5);
    CGContextSetLineJoin(context, kCGLineJoinRound);

    //添加路径
    CGContextAddPath(context, path);

    //绘制
    CGContextDrawPath(context, kCGPathStroke);
}

6.我用到了两个block方法,实时获取下载进度和监听下载是否完成,如果完成了则绘制打勾的图形,超简单

//获取进度的block方法
- (void) setMyBlock:(EndyBlock)endy {

    _block = endy;

    self.endY = _block();

}

//判断下载是否完成
- (void) setYesBlock:(isYesBlock)isy {

    self.isy = isy();
}

ps:做的比较糙,╮(╯﹏╰)╭,好久没敲代码,最近比较烦比较烦………懵逼的状态…..
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值