AVPlayer

在iOS开发中,播放视频通常有两种方式,一种是使用MPMoviePlayerController(需要导入MediaPlayer.Framework),还有一种是使用AVPlayer。AVPlay既可以用来播放音频也可以用来播放视频,AVPlay在播放音频方面可以直接用来播放网络上的音频。在使用AVPlay的时候我们需要导入AVFoundation.framework框架,再引入头文件#import<AVFound
ation/AVFoundation.h>。

AVPlayer视频播放

在开发中,单纯的使用AVPlayer类是无法现实视频的,要将视频添加到AVPlayerLayer中,这样才能将视频现实出来,所以我们先在@interface中添加一下属性

@property (strong, nonatomic)AVPlayer *myPlayer;//播放器
@property (strong, nonatomic)AVPlayerItem *item;//播放单元
@property (strong, nonatomic)AVPlayerLayer *playerLayer;//播放界面(layer)

我们简单介绍一下这三个属性之间的关系吧
首先我们之所以能够看到视频是因为AVPlayerLayer帮我们把视频呈现出来了,可以说是AVPlayerLayer就是一个视频播放器的载体,它负责需要播放的画面。用MVC比喻,就是AVPlayerLayer属于V层,负责对用户的呈现。从AVPlayerLayer的便利构造器方法中可以看出我们在创建一个AVPlayerLayer的时候需要一个AVPlayer类型的参数。所以在创建AVPlayerLayer的时候,我们需要先有一个AVPlayer,它用MVC来分类的话就相当于MVC中的C层,负责播放单元和播放界面的协调工作,我们在它的便利构造器方法中可以看到他需要我们传入一个AVPlayerItem也就是播放单元,所谓的播放单元就是给播放器提供了一个数据的来源,用MVC来类比的话,它就属于M层,在创建一个播放单元的时候,我们首先得需要一个网址。
综上所述,将一个视频播放出来可分为如下几个步骤。
第一步:首先我们需要一个播放的网址

    NSURL *mediaURL = [NSURL URLWithString:@"http://baobab.wdjcdn.com

第二步:初始化一个播放单元

 self.item = [AVPlayerItem playerItemWithURL:mediaURL];

第三步:初始化一个播放器对象

self.myPlayer = [AVPlayer playerWithPlayerItem:self.item];

第四步:初始化一个播放器的Layer

self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.myPlayer];
self.playerLayer.frame = CGRectMake(0, 0, self.view.bounds.size.width, 500);
[self.view.layer addSublayer:self.playerLayer];

第五步:开始播放

[self.myPlayer play];

只要顺序执行上面的五个步骤,就可以将一个视频播放到界面上。当然现在还只是能够播放了而已,要具体实现视频的快进快退功能,请继续往下看。

AVPlayer视频快进快退

播放进度 CMTime类型一般是用来表示视频或者动画的时间类型。CMTime对象的Value属性是用来得到当前视频或者动画一共有多少帧,timescale指的是每秒多少帧;timescale指的是每秒多少帧,value/timescale = 视频的总时长(秒)
视频的快进快退,首先我们声明了两个属性

@property (strong, nonatomic)UISlider *avSlider;//用来现实视频的播放进度,并且通过它来控制视频的快进快退。
@property (assign, nonatomic)BOOL isReadToPlay;//用来判断当前视频是否准备好播放。

在这里我们将上面前四个步骤封装到一个方法中,并且在这个方法中给播放单元也就是AVPlayerItem添加一个监听,来监听它的状态。

-(void)avPlayerMethod{
//构建播放网址NSURL *mediaURL = [NSURL URLWithString:@"http://baobab.wdjcdn.com/1455782903700jy.mp4"];
//构建播放单元self.item = [AVPlayerItem playerItemWithURL:mediaURL];
//构建播放器对象self.myPlayer = [AVPlayer playerWithPlayerItem:self.item];
//构建播放器的layerself.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.myPlayer];self.playerLayer.frame = CGRectMake(0, 66, self.view.bounds.size.width, 300);[self.view.layer addSublayer:self.playerLayer];//通过KVO来观察status属性的变化,来获得播放之前的错误信息[self.item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
}

KVO的回调方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:
(NSDictionary<NSString *,id> *)change context:(void *)context{if ([keyPath isEqualToString:@"status"]) {//取出status的新值AVPlayerItemStatus status = [change[NSKeyValueChangeNewKey]intValue];switch (status) {case AVPlayerItemStatusFailed:NSLog(@"item 有误");self.isReadToPlay = NO;break;case AVPlayerItemStatusReadyToPlay:NSLog(@"准好播放了");self.isReadToPlay = YES;self.avSlider.maximumValue = self.item.duration.value / self.item.duration.timescale;break;case AVPlayerItemStatusUnknown:NSLog(@"视频资源出现未知错误");self.isReadToPlay = NO;break;default:break;}}//移除监听(观察者)[object removeObserver:self forKeyPath:@"status"];
}

视频的播放按钮

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];button.frame = CGRectMake(250, 600, 100, 100);button.backgroundColor = [UIColor redColor];[button setTitle:@"按钮" forState:UIControlStateNormal];[button addTarget:self action:@selector(playAction) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:button];

button的回调方法

- (void)playAction{if ( self.isReadToPlay) {[self.myPlayer play];}else{NSLog(@"视频正在加载中");}
}

创建一个进度条来控制视频的进度
使用懒加载的方式,将进度条添加到View上面

- (UISlider *)avSlider{if (!_avSlider) {_avSlider = [[UISlider alloc]initWithFrame:CGRectMake(0, 55, self.view.bounds.size.width, 30)];[self.view addSubview:_avSlider];}return _avSlider;
}

在viewDidLoad中个slider(进度条)添加一个回调。

[self.avSlider addTarget:self action:@selector(avSliderAction) forControlEvents:
UIControlEventTouchUpInside|UIControlEventTouchCancel|UIControlEventTouchUpOutside];

回调方法

- (void)avSliderAction{//slider的value值为视频的时间float seconds = self.avSlider.value;//让视频从指定的CMTime对象处播放。CMTime startTime = CMTimeMakeWithSeconds(seconds, self.item.currentTime.timescale);//让视频从指定处播放[self.myPlayer seekToTime:startTime completionHandler:^(BOOL finished) {if (finished) {[self playAction];}}];
}

以上就是实现一个视频的播放和快进快退的方法与步骤。

iOS AVPlayer的使用相关推荐

  1. iOS AVPlayer视频播放器

    代码地址如下: http://www.demodashi.com/demo/11168.html 一.运行效果 二.实现过程 ①.创建播放器avPlayer //创建播放器url = [url str ...

  2. android ios av tv,iOS AVPlayer 实现后台连续播放视频

    最近接到一个需求,需要做一个在后台播放视频的功能.折腾了一下,最后总算完成了.因此写一篇文章,介绍下具体的实现步骤,也说说自己遇到的坑,算是总结和记录. 前言 当 App 退到后台时,会进入 susp ...

  3. IOS AVPlayer无法播放H265编码格式的MP4视频

    具体现象 使用 IOS 的 AVPlayer 播放 H265编码格式的mp4视频时,只有声音无图像. 原因 H265即 HEVC,在打包成mp4时需要有 codec tag.hev1 or hvc1是 ...

  4. iOS AVPlayer 与 AVPlayerViewController

    iOS 媒体功能主要的类 AVPlayer 全功能影音播放器 AVPlayerLayer 主要用于显示视频 AVPlayerViewController 提供了默认的可视化控制界面 一. AVPlay ...

  5. iOS AVPlayer和AVPlayerViewController

    1. AVPlayer AVPlayer是iOS常见的播放器,使用时需导入 #import <AVKit/AVKit.h> AVPlayer能控制播放器的播放,暂停,播放速度 // 初始化 ...

  6. iOS AVPlayer 简单应用

    //1 AVPlayerViewController *avvc = [[AVPlayerViewController alloc] init]; //2 avvc.player = [[AVPlay ...

  7. iOS AVplayer 基本使用方法

    *说明:利用AVPlayer可以制作视频播放器.音频播放器:使用AVPlayer播放过的格式有 .mp4  .m3u8   .mp3 1.创建播放器: _player = [[AVPlayer all ...

  8. iOS - AVPlayer播放视频,获取视频尺寸(宽高)

    公司启动页要求播放视频,其实很简单,AVPlayer可以胜任此任务. - (void)playVideoWithType:(NSString *)type {//获取视频sizeNSURL *medi ...

  9. iOS AVPlayer的一些定制

    用户点击了播放视频,但是此时手机是静音状态,产品说静音状态下也需要把声音给播放出来,so~ 原文: https://www.jianshu.com/p/998709165dfd 首先你要确保playe ...

最新文章

  1. c语言模拟考试题目,10道C语言笔试模拟题
  2. 《神经元》发表脑智卓越中心关于灵活分类决策神经环路机制的研究成果
  3. 美国任命首位首席信息安全官
  4. c语言按行存储数据库,C语言实现按行读写文件
  5. Some Principles
  6. 题外:分类篇(音乐风格分类)基于BP神经网络
  7. Android 开发笔记___Activity的生命周期
  8. 以太网的phy寄存器分析
  9. 为什么有些小区业主不愿意交物业费?
  10. 捐款捐物捐技术,14 家科技巨头抗疫在行动!
  11. 串口屏与6050_MPU6050 STM32控制 六轴传感器,可通过串口屏显示,还可连接匿名上位机 欧拉角 SCM 单片 发 267万源代码下载- www.pudn.com...
  12. 解析、查询身份证号代码
  13. R语言 聚类分析代码 系统聚类 K均值聚类 可视化
  14. H3CIE网络工程师成长之路
  15. linux脚本看日历,Linux查看日历之cal命令
  16. IEEEtran模板使用Bibtex插入DOI不显示问题
  17. JUL配置文件进行相关配置
  18. SVG格式转json文件
  19. 配置Web DashBoard
  20. 数据库DevOps:我们如何提供安全、稳定、高效的研发全自助数据库服务-iDB/DMS企业版...

热门文章

  1. HTML+CSS学习demo合集
  2. 键盘win键和alt键功能互换解决办法(亲测实用)
  3. ruby非阻塞式socket编程--写飞信客户端的经验总结
  4. 数据结构与算法(十九)——动态规划
  5. 潜水员(二维费用的背包问题)
  6. 写个性签名也要花心思,做短视频如何设置个签?四个小技巧来帮忙
  7. js的window.print()打印背景图片,打印背景图片无法显示
  8. 史上最全的亚马逊防关联技巧|跨境知道
  9. 视频图像解码失败播放的时候,为什么是绿屏而不是红屏
  10. 小孩子如何学会说话?