学习内容

先上项目地址,一个简单的AVPlayerDemo: https://github.com/practiceqian/QCAVPlayerDemo

AVPlayer学习

  1. 几个播放器相关的类

    • AVPlayer、AVURLAsset、AVPlayerItem、AVPlayerLayer

      //控制播放器的播放、暂停、播放速度
      @property (nonatomic,strong) AVPlayer * player;
      //管理资源对象,提供播放数据源
      @property (nonatomic,strong) AVPlayerItem* playItem;
      //负责显示视频,如果没有添加该类,只有声音没有画面
      @property (nonatomic,strong) AVPlayerLayer* playerLayer;
  2. 构建一个简单的播放器

    • //一个UIImageView,构建播放器的显示区域
      self.playerView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/3)];
      [self.view addSubview:self.playerView]; //播放资源
      NSURL* playUrl = [NSURL URLWithString:@"http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"];
      self.playItem = [AVPlayerItem playerItemWithURL:playUrl];
      //播放器实例
      self.player = [AVPlayer playerWithPlayerItem:self.playItem];
      //显示区域
      self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
      self.playerLayer.frame = self.playerView.bounds;
      //将显示区域添加到UIImageView上
      [self.playerView.layer addSublayer:self.playerLayer];
      //开始播放
      [self.player play];
    • 效果如图

      • 可以在UIImageView的容器中看到画面,但是此时依然不能控制播放的进度等
  3. 使用AVPlayer控制播放行为

    • //播放
      [self.player play];
      //暂停
      [self.player pause];
      //控制播放速度
      self.player.rate = 2.0
  4. 使用AVPlayerItem控制播放状态

    • //三种播放状态
      typedef NS_ENUM(NSInteger, AVPlayerItemStatus) {
      AVPlayerItemStatusUnknown = 0, //未知
      AVPlayerItemStatusReadyToPlay = 1, //准备播放
      AVPlayerItemStatusFailed = 2 //播放失败
      };
    • 使用KVO进行监听播放状态

      //对status进行监听
      [self.playItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
      //监听的回调
      - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
      if ([object isKindOfClass:[AVPlayerItem class]]) {
      if ([keyPath isEqualToString:@"status"]) {
      //根据播放的三种状态进行处理
      switch (self.playItem.status) {
      case AVPlayerItemStatusUnknown:
      NSLog(@"播放状态未知");
      break;
      case AVPlayerItemStatusReadyToPlay:
      NSLog(@"准备播放");
      break;
      case AVPlayerItemStatusFailed:
      NSLog(@"播放失败");
      break;;
      default:
      break;
      }
      }
      }
      }
    • 获取播放时间

      • //CMTime是以分数的形式表示时间,value表示分子,timescale表示分母,flags是位掩码,表示时间的指定状态。
        typedef struct{
        CMTimeValue value; // 帧数
        CMTimeScale timescale; // 帧率(影片每秒有几帧)
        CMTimeFlags flags;
        CMTimeEpoch epoch;
        } CMTime;
      • //获取当前的播放时间
        float currentTime = self.playItem.currentTime.value/self.playItem.currentTime.timescale;
        //获取视频的总时间(一般在准备播放状态时获取)
        float totalTime = CMTimeGetSeconds(self.playItem.duration);
    • 监听播放的进度

      • __weak typeof(self) weakSelf = self;
        //CMTimeMake(1,1),一秒钟监听一次
        [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:nil usingBlock:^(CMTime time) {
        AVPlayerItem* item = weakSelf.playItem;
        float curTime = item.currentTime.value/item.currentTime.timescale;
        NSLog(@"当前时间:%.0f",curTime);
        }];
    • 监听缓冲的进度

      [self.playItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
      ---------------------------------------------------------------
      if ([keyPath isEqualToString:@"loadedTimeRanges"]){
      NSArray *array = self.playItem.loadedTimeRanges;
      CMTimeRange timeRange = [array.firstObject CMTimeRangeValue];//本次缓冲时间范围
      float startSeconds = CMTimeGetSeconds(timeRange.start);
      float durationSeconds = CMTimeGetSeconds(timeRange.duration); NSTimeInterval totalBuffer = startSeconds + durationSeconds;//缓冲总长度
      NSLog(@"当前已缓冲时间:%f",totalBuffer);
      }
    • 监听已缓存时间充足/不足

      [self.playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];
      ---------------------------------------------------------------------
      [self.playerItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil];
    • 最后的demo



最后欢迎关注我的iOS学习总结——每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary

AVPlayer的使用+简单的播放器Demo的更多相关文章

  1. Android——简单音乐播放器

    使用MediaPlayer做的简单音乐播放器,更多内容请到百度经验查看   http://jingyan.baidu.com/article/60ccbceb63452364cab197f1.html ...

  2. iOS之基于FreeStreamer的简单音乐播放器(模仿QQ音乐)

    代码地址如下:http://www.demodashi.com/demo/11944.html 天道酬勤 前言 作为一名iOS开发者,每当使用APP的时候,总难免会情不自禁的去想想,这个怎么做的?该怎 ...

  3. Android开发6:Service的使用(简单音乐播放器的实现)

    前言 啦啦啦~各位好久不见啦~博主最近比较忙,而且最近一次实验也是刚刚结束~ 好了不废话了,直接进入我们这次的内容~ 在这篇博文里我们将学习Service(服务)的相关知识,学会使用 Service ...

  4. Android 实现简单音乐播放器(二)

    在Android 实现简单音乐播放器(一)中,我介绍了MusicPlayer的页面设计. 现在,我简单总结一些功能实现过程中的要点和有趣的细节,结合MainActivity.java代码进行说明(写出 ...

  5. Android 实现简单音乐播放器(一)

    今天掐指一算,学习Android长达近两个月了,今天开始,对过去一段时间的学习收获以及遇到的疑难杂症做一些总结. 简单音乐播放器是我自己完成的第一个功能较为完整的APP,可以说是我的Android学习 ...

  6. html5 简单音乐播放器

    html5 简单音乐播放器 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> < ...

  7. Android实现简单音乐播放器(MediaPlayer)

    Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能 ...

  8. 快速构建Windows 8风格应用21-构建简单媒体播放器

    原文:快速构建Windows 8风格应用21-构建简单媒体播放器 本篇博文主要介绍如何构建一个简单的媒体播放器. <快速构建Windows 8风格应用20-MediaElement>博文中 ...

  9. [SimplePlayer] 实现一个简单的播放器

    简单的播放器需要实现一个最基本的功能:播放视频文件. 实现这个功能需要包含以下几个步骤: 从视频文件中提取视频图像 在屏幕上显示视频图像 视频帧的同步,也就是保证视频图像在合适的时间在屏幕上显示 从视 ...

随机推荐

  1. JasperReports入门教程(四):多数据源

    JasperReports入门教程(四):多数据源 背景 在报表使用中,一个页面需要打印多个表格,每个表格分别使用不同的数据源是很常见的一个需求.假如我们现在有一个需求如下:需要在一个报表同时打印所有 ...

  2. PHP使用token防止表单重复提交的方法

    本文实例讲述了PHP使用token防止表单重复提交的方法.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  3. 2019-2020-1 20199325《Linux内核原理与分析》第六周作业

    正常的使用gdb跟踪分析函数调用 使用make rootfs命令 *用gdb跟踪分析一个系统调用内核函数 对于宏SAVE_ALL来说,这条语句会保存当前线程的现场,然后是执行system_call,跳 ...

  4. LVS+Keepalived 实现高可用负载均衡集群

    LVS+Keepalived  实现高可用负载均衡集群     随着网站业务量的增长,网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如 F5 ,Array又太贵,你们又是创业型互联公司如何有效 ...

  5. Django入门4: ORM 数据库操作

    大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...

  6. Java程序员必备基础结构图

    前言 最近看了深入理解Java虚拟机第三版,整理了一些基础结构图,算是比较全的了,做一下笔记,大家一起学习. 1.Java虚拟机运行时数据区图 JVM内存结构是Java程序员必须掌握的基础. 程序计数 ...

  7. mac OS nvm 常用命令

    nvm install stable ## 安装最新稳定版 node,当前是node v10.15.0 (npm v6.4.1) nvm install <version> ## 安装指定 ...

  8. embed git commit hash to assembly

    https://stackoverflow.com/a/41200059/3782855 https://github.com/304NotModified/Fody.Stamp

  9. 团队一致性的PHP开发环境之Docker

    docker php环境模型 docker 简介 Docker 是一个开源的应用容器引擎 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现 ...

  10. CentOS 6.5下通过yum安装MongoDB记录

    安装MongoDB 1.创建repo vi /etc/yum.repos.d/mongodb-org-3.6.repo   [mongodb-org-3.6]   name=MongoDB Repos ...