代码地址如下:
http://www.demodashi.com/demo/11168.html

一、运行效果

二、实现过程

①、创建播放器avPlayer

       //创建播放器url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];AVPlayer *player = [AVPlayer playerWithURL:[NSURL URLWithString:url]];self.avPlayer = player;

②、创建显示屏_videoLayer

- (void)createDisplay{// 显示图像的_videoLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];//锚点的坐标_videoLayer.position = CGPointMake(KPLAYVIEWWIDTH/2, KPLAYVIEWHEIGHT/2);_videoLayer.bounds = CGRectMake(0, 0, KPLAYVIEWWIDTH, KPLAYVIEWHEIGHT);// 锚点,值只能是0,1之间_videoLayer.anchorPoint = CGPointMake(0.5, 0.5);//     AVLayerVideoGravityResizeAspect 按比例压缩,视频不会超出Layer的范围(默认)//     AVLayerVideoGravityResizeAspectFill 按比例填充Layer,不会有黑边//     AVLayerVideoGravityResize 填充整个Layer,视频会变形//     视频内容拉伸的选项_videoLayer.videoGravity = AVLayerVideoGravityResizeAspect;//    //播放时,视频实际占的区域//    NSLog(@"%@", NSStringFromCGRect(videoLayer.videoRect));//Layer只能添加到Layer上面[self.displayView.layer addSublayer:_videoLayer];
}

③、添加观察者和通知,用于监测更新视频播放的状态、进度、屏幕方向、状态栏属性、音量等等。

主要代码如下:

//监测屏幕旋转[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChange:) name:UIDeviceOrientationDidChangeNotification object:nil];//添加AVPlayerItem播放结束通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.avPlayer.currentItem];//添加AVPlayerItem开始缓冲通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bufferStart:) name:AVPlayerItemPlaybackStalledNotification object:self.avPlayer.currentItem];//KOV监控 播放器进度更新
- (void)addObserverForAVPlayer
{AVPlayerItem *playerItem = self.avPlayer.currentItem;// 给AVPlayer添加观察者 必须实现 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;//监控播放速率[self.avPlayer addObserver:self forKeyPath:@"rate" options:NSKeyValueObservingOptionNew context:nil];//监控状态属性(AVPlayer也有一个status属性,通过监控它的status也可以获得播放状态)[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];//监控网络加载缓冲情况属性[playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];//监控是否可播放[playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];//播放进度观察者  //设置每0.1秒执行一次__weak GOVVideoView *weakSelf = self;_playerTimeObserver =  [self.avPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 10.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {if (weakSelf.dragSlider) {return ;}CGFloat current = CMTimeGetSeconds(time);weakSelf.current = current;CMTime totalTime = weakSelf.avPlayer.currentItem.duration;CGFloat total = CMTimeGetSeconds(totalTime);weakSelf.total = total;weakSelf.slider.value = current/total;weakSelf.currentTimeLabel.text = [weakSelf timeFormatted:current];weakSelf.totalTimeLabel.text = [NSString stringWithFormat:@"/%@",[weakSelf timeFormatted:total]] ;}];
}//通过KVO监控回调
//keyPath 监控属性 object 监视器 change 状态改变 context 上下文
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{if ([keyPath isEqualToString:@"loadedTimeRanges"]) {//监控网络加载情况属性NSArray *array = self.avPlayer.currentItem.loadedTimeRanges;//本次缓冲时间范围CMTimeRange timeRange = [array.firstObject CMTimeRangeValue];CGFloat startSeconds = CMTimeGetSeconds(timeRange.start);CGFloat durationSeconds = CMTimeGetSeconds(timeRange.duration);//现有缓冲总长度CGFloat totalBuffer = startSeconds + durationSeconds;//视频总时长CMTime totalTime = self.avPlayer.currentItem.duration;CGFloat total = CMTimeGetSeconds(totalTime);if (totalBuffer/total <= 1.0 ) {[self.progressView setProgress:totalBuffer/total animated:YES];}}else if([keyPath isEqualToString:@"playbackLikelyToKeepUp"]){if (self.avPlayer.currentItem.playbackLikelyToKeepUp == YES) {if (_activityView != nil) {[self.activityView startAnimating];[self.activityView removeFromSuperview];_activityView = nil;}}}else if ([keyPath isEqualToString:@"status"]){//监控状态属性AVPlayerStatus status = [[change objectForKey:@"new"] intValue];switch ((status)) {case AVPlayerStatusReadyToPlay:break;case AVPlayerStatusUnknown:break;case AVPlayerStatusFailed:break;}}else if ([keyPath isEqualToString:@"rate"]){if (self.avPlayer.rate == 1) {}}}

隐藏/显示状态栏的方法:

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];这个方法在iOS9之后弃用了,并且需要
将View controller-based status bar appearance设置为NO;而下面的重写方法需要将View controller-based status bar appearance设置为YES,这个方法在iOS7之后就有了;
//刷新状态栏状态
[self setNeedsStatusBarAppearanceUpdate];

#pragma mark -- 隐藏/显示状态栏的方法
/*[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];这个方法在iOS9之后弃用了,并且需要将View controller-based status bar appearance设置为NO;而下面的重写方法需要将View controller-based status bar appearance设置为YES,这个方法在iOS7之后就有了;
//刷新状态栏状态[self setNeedsStatusBarAppearanceUpdate];*/
//设置样式
- (UIStatusBarStyle)preferredStatusBarStyle {return UIStatusBarStyleLightContent;
}
//设置是否隐藏
- (BOOL)prefersStatusBarHidden {return self.isHiddenStatusBar;
}
//设置隐藏动画
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {return UIStatusBarAnimationNone;
}

④、创建用于处理播放结束、关闭播放器、全屏/退出全屏、隐藏/展示footBar和topBar的Block回调方法和代理方法,方便用户做些自定义的操作。

//Block回调方法
typedef void(^FullScreenBlock)(BOOL isFull);typedef void(^ClosePLayerBlock)();typedef void(^ShowBarBlock)(BOOL isShow);typedef void(^PlayFinishedBlock)();@class GOVVideoPlayer;
//代理方法
@protocol GOVVideoPlayerDelegate  <NSObject>//播放结束
- (void)videoPlayerPlayFinished:(GOVVideoPlayer *)videoPlayer;//关闭播放器
- (void)videoPlayerClosePlayer:(GOVVideoPlayer *)videoPlayer;//全屏按钮
- (void)videoPlayerFullScreen:(GOVVideoPlayer *)videoPlayer withIsFull:(BOOL)isFull;//隐藏/展示footBar和topBar
- (void)videoPlayerShowBar:(GOVVideoPlayer *)videoPlayer withIsShow:(BOOL)isShow;

三、项目结构图

四、补充

GOVVideoPlayer是在继承于UIView的基础上封装的视频View;
GOVVideoController是在继承于UIViewController的基础上封装的视频视图控制器。
两者最大的不同是在全屏和取消全屏的处理上面:前者是一个视图View,可以直接加在父视图上面,全屏时是加在 [UIApplication sharedApplication].keyWindow上的,而后者,小屏时是取GOVVideoController的View加在父视图上,全屏和取消全屏时是采用present和dismiss模态化转场的方法 。

iOS AVPlayer视频播放器

代码地址如下:
http://www.demodashi.com/demo/11168.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

iOS AVPlayer视频播放器相关推荐

  1. iOS 各视频播放器评价~总结

    //联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 一.[免费]专场 VLC 评:超好用,觉得可以媲美收费App!原本手机留着的AcePlayer和QQ影音都删掉了.独有的汉堡菜单挺有 ...

  2. android ios 传视频播放器,推荐用于iOS / Android全面格式的视频播放器|手机最强大的播放器...

    几天前,一个朋友以ts格式下载了一些高清电视剧,但是无法在iPad上播放,因此我想在计算机上将其转换为MP4格式. 花了时间和精力,结果并不令人满意. 事实上手机上的万能播放器,所有平台现在都具有支持 ...

  3. react native实现兼容Android与ios的视频播放器

    呦吼-,我来啦,这是我的第一篇文章,当然是福利啦,项目代码可以直接运行使用的呀,这种便宜尽情挥霍去吧-.好了装嫩结束,来点实际的,这个项目其实是我主讲的一门视频课程(看文章就可以学到所有知识,若需要可 ...

  4. iOS WMPlayer视频播放器

    在github收藏了一个视频播放demo,适用方便,收藏了. 1.WMPlayer视频播放器,AVPlayer的封装,继承UIView. 2.支持播放mp4.m3u8.3gp.mov 3.网络和本地视 ...

  5. iOS自带AVPlayer视频播放器

    前言 iOS8之后系统自带使用AVPlayerViewController播放视频 AVPlayerViewController AVPlayerViewController和导航控制器差不多,需要将 ...

  6. swift AVFoundation AVPlayer 视频播放器——swift学习(十)

    播放器 对于资源的播放,你应使用AVPlayer类.你可以使用AVPlayerItem实例去管理整个资源的显示状态,使用AVPlayerIteamTrack类去管理单独任务的显示状态.你可以使用AVP ...

  7. iOS 教你使用MP、AVPlayer、AVPlayerVC构建一个完整的视频播放器

    1.前言 标题必须要浮夸!要感觉像是一个大新闻.长者如是说. 其实是前几天去面试的时候,被要求说必须做过视频播放相关项目.有点闹心之余,就花了点时间在家写了一个简单播放器,基本实现了主流播放器的大致功 ...

  8. html ios视频播放器,良心推荐!iOS端的视频播放应用

    不知道大家还记不记得之前小编我推荐的最好用的iOS音乐播放器,如果没看过,可以点击这里.既然之前介绍了一款iOS端的音乐播放器给大家,那么今天就介绍一款iOS端十分好用的万能解码的视频播放器. 使用i ...

  9. iOS音视频播放-AVPlayer简单使用

    按公司需求需要对音频文件进行后台播放,借此机会对音频播放做了个总结.主要针对 AVPlayer 进行详细说明. iOS 各播放器比较 名称 使用环境 优点 确点 System Sound Servic ...

最新文章

  1. 实用javaScript技术-屏蔽总结
  2. 华思视频 CCNA 听而思
  3. 【Spring-AOP-1】AOP相关概念
  4. [清华集训2017]无限之环(网络流)
  5. kolla-ansible-----常用命令
  6. Python官方文档学习心得(第五篇)
  7. phpstudy运行PHP项目出现404怎么办?
  8. 亚马逊RDS使用的第三方扩展有漏洞,可导致内部凭据遭泄露
  9. 全新的移动界面设计素材
  10. php循环产生复选框,史上最详细的vue动态生成checkbox的选项并实现多选框的保存回显...
  11. vue使用Mars3D实现3d卫星轨道和3d地球图
  12. c语言转义字符详解,C语言转义字符和格式控制符参考
  13. 《时间的秩序》-- 卡洛.罗韦利
  14. BUCTOJ2021年ACM竞赛班训练九题解
  15. 其他的一些生活小常识
  16. mybatis源码解析(一)
  17. 简易的GUI图书管理系统(数据库Mysql)
  18. jquery表情 juqery qq表情适用jQuery QQ表情插件jquery.qqFace
  19. 运维日记003--环境搭建与简单配置
  20. 简述机车计算机控制系统的组成,简述机车微机控制系统主要功能? - 问答库

热门文章

  1. STM32CAN外设使用
  2. application实现网页计数_利用百度ai实现文本和图片审核
  3. mysql安装过程遇到的问题_个人在mysql安装过程中遇见的问题
  4. 选择开还是关 pxe_商用披萨(53)开披萨店是选择加盟还是自创品牌呢?
  5. linux查看允许创建多少个进程,Linux下查看某个进程创建了多少线程
  6. android csv显示乱码问题,Android CSV解析器问题
  7. 仓鼠大厦java下载_仓鼠大厦食盐宫殿 世界古怪酒店TOP10(组图)
  8. word中添加mathtype
  9. elasticsearch java api查询
  10. 注册页面的JSON响应方式详细分析(与前端页面交互方式之一)