#import "ViewController.h"

#import <AVFoundation/AVFoundation.h>

@interface ViewController ()

{

    AVPlayer *player;

    AVPlayerItem *playerItem;

    

    UIProgressView * progressView;

    UISlider *_slider;

    

    //推断slider是否按下,

    BOOL isOpen;

}

@end



@implementation ViewController



- (void)viewDidLoad {

    [super viewDidLoad];

    [self createUI];

    //进行初始化创建

    NSURL *url = [NSURL fileURLWithPath:@"/Users/qianfeng01/Downloads/千锋Swift视频教程-1.Swift语言介绍.mp4"];

    playerItem  = [[AVPlayerItem alloc]initWithURL:url];

    //创建player

    player = [[AVPlayer alloc]initWithPlayerItem:playerItem];

    //生成layer层

    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:player];

    //设置坐标

    layer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

    

    //把layer层假如到self.view.layer中

    [self.view.layer addSublayer:layer];

    //进行播放

    [player play];

    

    /**以上是主要的播放界面。可是没有前进后退**/

    //观察是否播放,KVO进行观察,观察playerItem.status

    [playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];

    

    //观察缓存如今的进度,KVO进行观察,观察loadedTimeRanges

    [playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];

}



//观察是否播放

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

    if ([keyPath isEqualToString:@"status"]) {

        if (playerItem.status == AVPlayerStatusReadyToPlay) {

            NSLog(@"開始播放");

            //须要開始获取数据,包含播放的总时长。播放的缓存,播放的当时时间

            [self loadData];

        }else{

            NSLog(@"播放失败");

        }

    }else{

        //kvo触发的另外一个属性

        NSArray *array = [playerItem loadedTimeRanges];

        //获取范围i

        CMTimeRange range = [array.firstObject CMTimeRangeValue];

        //从哪儿開始的

        CGFloat start = CMTimeGetSeconds(range.start);

        //缓存了多少

        CGFloat duration = CMTimeGetSeconds(range.duration);

        //一共缓存了多少

        CGFloat allCache = start+duration;

        NSLog(@"缓存了多少数据:%f",allCache);

        

        //设置缓存的百分比

        CMTime allTime = [playerItem duration];

        //转换

        CGFloat time = CMTimeGetSeconds(allTime);

        CGFloat y = allCache/time;

        NSLog(@"缓存百分比:--------%f",y);

        progressView.progress = y;

    }

}





#pragma mark -- 获取播放数据

- (void)loadData{

    

    __weak AVPlayerItem *xx = playerItem;

    __weak UISlider *cc = _slider;

    //第一个參数是每隔多长时间调用一次。在这里设置的是每隔1秒调用一次

    [player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:NULL usingBlock:^(CMTime time) {

        //当前播放时间

        CGFloat current = xx.currentTime.value/xx.currentTime.timescale;

        

        //获取总时长

        CMTime time1 = xx.duration;

        float x = CMTimeGetSeconds(time1);

        NSLog(@"当前播放的秒数------- %f --------%f",current,x);

        

        //设置滑动条进度

        float v = current/x;

        

        //推断slider是否按下,按下去就先别赋值

        if (!isOpen) {

            cc.value = v;

        }

        

    }];



}



#pragma mark --- 创建UI

- (void)createUI{

    progressView = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar];

    progressView.frame = CGRectMake(0, 460, self.view.frame.size.width, 20);

    

    [self.view addSubview:progressView];

    

    _slider = [[UISlider alloc]initWithFrame:CGRectMake(0, 480, self.view.frame.size.width, 20)];

    [self.view addSubview:_slider];

    

    

    //加入点击事件

    [_slider addTarget:self action:@selector(sliderClick:) forControlEvents:UIControlEventTouchUpInside];

    //抬起来的事件

    [_slider addTarget:self action:@selector(sliderClickUp:) forControlEvents:UIControlEventTouchUpInside];

}



    //加入点击事件

- (void)sliderClick:(UISlider *)slider{

    NSLog(@"加入点击事件");

    isOpen = YES;

}



    //抬起来的事件

- (void)sliderClickUp:(UISlider *)slider{

    NSLog(@"抬起来的事件");

    isOpen = NO;

    

    //从这里開始播放

    CGFloat g = slider.value;

    //获取总时长

    CMTime time1 = playerItem.duration;

    float x = CMTimeGetSeconds(time1);

    //进行播放

    [player seekToTime:CMTimeMake(x * g,1)];

    //播放

    [player play];

    

}





@end

AVPlayer的使用,带缓冲的更多相关文章

  1. JavaScript原生折叠扩展收缩菜单带缓冲动画

    JavaScript原生折叠扩展收缩菜单带缓冲动画 @落雨 <div id="div_two" style="display: none;"> &l ...

  2. js+css实现带缓冲效果右键弹出菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 文件I/O(不带缓冲)之原子操作

    一.添写至一个文件 考虑一个进程,它要将数据添加到一个文件尾端.早期的UNIX系统并不支持open的O_APPEND选项,所以程序被编写成下列形式: ) < ) /* position to E ...

  4. 文件I/O(不带缓冲)概述

    一.引言 UNIX系统中大多数文件I/O只需用到5个函数:open.read.write.lseek以及close.这些函数经常被称为不带缓冲的I/O(unbuffered I/O).术语不带缓冲指的 ...

  5. 带缓冲I/O和不带缓冲I/O的区别与联系

    转自:http://blog.csdn.net/lmh12506/article/details/6803847 首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用, ...

  6. 带缓冲的IO和不带缓冲的IO

    文件描述符: 文件描述符是一个小的非负整数,是内核用来标识特定进程正在访问的文件 标准输入/输出/出错: shell为每个程序打开了三个文件描述符,STDIN_FILEON,STDOUT_FILEON ...

  7. 带缓冲I/O 和不带缓冲I/O的区别与联系

    首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用.系统内核对磁盘的读写都会提供一个块缓冲(在有些地方也被称为内核高速缓存),当用write函数对其 ...

  8. UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O

    lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符. ...

  9. 第十三篇:带缓冲的IO( 标准IO库 )

    前言 在之前,学习了 read write 这样的不带缓冲IO函数. 而本文将讲解标准IO库中,带缓冲的IO函数. 为什么要有带缓冲IO函数 标准库提供的带缓冲IO函数是为了减少 read 和 wri ...

  10. Java 带缓冲的字节流和字符流

    输入流就是文件从硬盘到内存的中间媒介,那么输出流就是文件从内存到硬盘的中间媒介.首先来看看FileOutputStream的继承了哪些类, java.lang.Object java.io.Outpu ...

随机推荐

  1. Android 签名(5)用命令签名和用android studio,eclipse签名

    1,用命令签名 无论用哪个 IDE 开发,最终只是用了 keytool 和 jarsigner 这两个 Java 工具来完成签名任务(在 jdk 的 bin 目录下).其中 keytool 用来生成 ...

  2. 去掉myeclipse的预览窗口

    1,选择菜单: windows -> preferences2,在弹出窗口中选择General-> Editors -> FileAssociations3,在上方框内选择*.jsp ...

  3. Python爬取贴吧中的图片

    #看到贴吧大佬在发图,准备盗一下 #只是爬取一个帖子中的图片 1.先新建一个scrapy项目 scrapy startproject TuBaEx 2.新建一个爬虫 scrapy genspider ...

  4. ionic2\ionic3 自定义弹窗

    ionic2及ionic3没有了popup及 其templateUrl属性 那我们如何对弹窗里加入自定义元素 从而达到自定义弹窗样式 那么就可以通过写h5页面来实现 自定义弹窗效果: 写个H5的弹窗及 ...

  5. BAT文件如何注释

    1.BAT文件中如何注释: 1.:: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符) 2.rem 注释内容(不能出现重定向符号和管道符号) 3.echo 注释内容(不能出现重定向符号和管道符 ...

  6. win10 打开chm文件内容空白如何解决

    win10 打开chm文件内容空白如何解决 .CHM文件是非常常见的帮助文件格式.由于其便携性,很多小说或杂志也会采用chm格式.win7/win8.1/win10系统,由于采用了UAC,致使原本在x ...

  7. 【译】x86程序员手册10 - 第4章系统架构

    1.1.2 Part II -- Systems Programming 系统编程 This part presents those aspects of the architecture that ...

  8. SQLServer 异常捕获,回滚,再抛出

    一个存储过程中多个更新操作,后面的更新操作出现异常,如果不手动回滚前面修改的数据是不会自动撤销的! BEGIN TRY BEGIN TRAN -- ..... COMMIT TRAN END TRY ...

  9. Centos6.6 安装基于系统认证的vsftp服务

    一.介绍 vsftp是一款文件服务器软件,在文件共享,代码更新,文件备份中也是经常用到,以下是基本安装环境: 1)CentOS6.6 2)vsftpd-2.2.2 二.安装 $ yum install ...

  10. CAD在网页中返回当前图纸的最小外包矩形框

    主要用到函数说明: _DMxDrawX::GetMcDbDatabaseBound 返回当前图纸的最小外包矩形框,详细说明如下: 参数 说明 DOUBLE* pLbx 返回最小外包矩形框左下角X值 D ...