https://github.com/potato512/SYAVPlayer

使用AVPlayer播放本地视频,或网络视频,需要添加AVFoundation框架。

使用AVPlayer播放视频的优势在于,开发者可以自定义视频界面。同时可以通过通知模式、观察者模式、时间观察者模式监测播放时的各种状态。

效果图

关键源码

// 导入头文件
#import "AVMoviePlayer.h"
// 定义属性
@property (nonatomic, strong) AVPlayer *player;
// 实例化
- (void)playMovie
{// 播放本地视频NSString *urlStr = [[NSBundle mainBundle] pathForResource:@"movie02" ofType:@"mov"];NSURL *url = [NSURL fileURLWithPath:urlStr];// 播放网络视频
//    NSString *urlStr = @"http://devimages.apple.com/iphone/samples/bipbop/gear4/prog_index.m3u8";
//    NSURL *url = [NSURL URLWithString:urlStr];if (self.player){// 已经创建则不再创建return;}AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];self.player = [AVPlayer playerWithPlayerItem:item];AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.player];layer.frame = CGRectMake(10.0, 10.0, (self.view.bounds.size.width - 10.0 * 2), 200.0);[self.view.layer addSublayer:layer];[self.player play];// 设置KVC 播放结束[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playEndNotification:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];// 设置KVO[item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];// 设置每秒执行一次进度更新AVPlayerVC __weak *weakSelf = self;[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {float current = CMTimeGetSeconds(time);NSLog(@"1 current time = %.2f", current);float total = CMTimeGetSeconds([weakSelf.player.currentItem duration]);NSLog(@"2 total time = %.2f", total);if (current){CGFloat progress = current / total;NSLog(@"3 progress = %.2f", progress);}}];
}
// 通知模式
// 视频播放完成
- (void)playEndNotification:(NSNotification *)notification
{NSLog(@"视频播放完成");[self.player seekToTime:kCMTimeZero];
}
// 观察者模式
// 通过KVO监控播放器的状态
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{AVPlayerItem *playerItem = object;if ([keyPath isEqualToString:@"status"]){AVPlayerStatus status = [[change objectForKey:@"new"] intValue];if (status == AVPlayerStatusReadyToPlay){NSLog(@"正在播放:%.2f", CMTimeGetSeconds(playerItem.duration));}}else if([keyPath isEqualToString:@"loadedTimeRanges"]){NSArray *array = playerItem.loadedTimeRanges;// 本次缓冲时间范围CMTimeRange timeRange = [array.firstObject CMTimeRangeValue];float startSeconds = CMTimeGetSeconds(timeRange.start);float durationSeconds = CMTimeGetSeconds(timeRange.duration);// 缓冲总长度NSTimeInterval totalBuffer = startSeconds + durationSeconds;NSLog(@"共缓冲:%.2f", totalBuffer);}
}
// 调用
- (void)playPause:(id)sender
{[self playMovie];if (self.player.rate == 0){// 暂停时,继续播放[self.player play];}else if (self.player.rate == 1){// 正在播放时,暂停[self.player pause];}
}

AVPlayer播放视频(本地视频,或网络视频)相关推荐

  1. Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频

    Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频 前期准备 在之前的博文,Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 ...

  2. iOS 用 AVPlayer 播放一个本地音频文件

    iOS 用 AVPlayer 播放一个本地音频文件 步骤 第一步:在 Project - TARGETS - Project名 - Build Phases - Link Binary With Li ...

  3. iOS Dev (21) 用 AVPlayer 播放一个本地音频文件

    iOS Dev (21) 用 AVPlayer 播放一个本地音频文件 作者:CSDN 大锐哥 博客:http://blog.csdn.net/prevention 前言 这篇文章与上一篇极其相似,要注 ...

  4. H.264视频编码标准在网络视频监控系统中的应用 .

    [摘 要]本文介绍了ITU-T最新高性能视频压缩标准H.264和网络视频监控应用系统的需求.从编码效率和网络适应性方面讨论了H.264中所采用的新技术,最后介绍了它在网络视频监控系统中的应用. (这里 ...

  5. H.264视频编码标准在网络视频监控系统中的应用

    [摘 要]本文介绍了ITU-T最新高性能视频压缩标准H.264和网络视频监控应用系统的需求.从编码效率和网络适应性方面讨论了H.264中所采用的新技术,最后介绍了它在网络视频监控系统中的应用. (这里 ...

  6. 网络视频监控服务器的作用,网络视频监控服务器有哪些优势?其特点主要有哪些?...

    原标题:网络视频监控服务器有哪些优势?其特点主要有哪些? 现在到处都有监控摄像头.虽然这些监视器对我们的日常生活影响不大,但这种网络视频监控服务器在发生事故或我们真正需要的时候非常有用.例如,为了财产 ...

  7. 视频监控p2p android,网络视频监控P2P解决方案:NAT穿越

    NAT的穿越并非安防监控领域的技术,是目前VOIP以及即时通信等产品的基础性技术,目前来讲已经比较成熟,且有完整的技术标准RFC,同时也有众多的实现方案,包括许多已经得到广泛应用的开源项目. 简单来讲 ...

  8. 基于OpenCV打开本地视频/本地USB摄像头/网络IP摄像头

    前言 最近进行各种测试,总结下! 预备 首先来一张OpenCV关于VideoCapure的介绍,说明很清楚,能够用来读取.avi视频文件,.jpg格式的图片序列,以及网络摄像头. 程序 程序很简单,不 ...

  9. Android Studio 实现播放本地/网络视频

    Android Studio 实现播放本地/网络视频 目的 工具及环境 功能设计 VideoView 简介 常用方法 代码解释 本地视频播放器 activity_main.xml MainActivi ...

  10. 基于eclipse的android项目实战—博学谷(十八)播放不同视频(网络视频)

    相信经过了这么长时间,小伙伴们应该都发现了博学谷这个项目存在问题,播放视频的时候,无论播放任何一个章节,他播放的视频都只是一个,也就是VideoPlayActivity.java里面写死的那个(myv ...

最新文章

  1. Go安装web框架revel
  2. linux fedora设置开机自动挂载win磁盘
  3. Java读取多层级xml文件
  4. java自定义tag,tag文件与tag标记,java自定义标签
  5. SQl---基础整理6--数据库的创建
  6. 【LeetCode】剑指 Offer 18. 删除链表的节点
  7. 受iPhone 12销量变化影响 Q2柔性OLED面板出货量预计环比下滑35%
  8. 无法将 char 值转换为 money。该 char 值的语法有误。_java 基础语法 (下)
  9. 计算机科学与技术 课表 武汉,欢迎访问武汉理工大学计算机科学与技术学院
  10. 理解Angular的Reactive Form
  11. if mysql sum 视图_MySQL(Excel透视)
  12. 切割钢板计算机软件,板材切割优化软件钢板开料套料软件 V1.0 官方版
  13. 全球第一开源ERP Odoo操作手册 数据库简介
  14. 运动控制器位置锁存功能的应用
  15. ES RestClient查询文档
  16. “2019年全国职业院校技能大赛”高职组计算机网络应用竞赛竞赛样题B卷(软件定义网络部分答案参考)
  17. 聚合数据--汇率接口调用
  18. 强制修改服务器时间,修改服务器时间脚本
  19. 奢华酒店品牌美高梅将入驻上海西岸;ClinChoice昆翎完成1.5亿美元融资 | 美通企业日报...
  20. SpringMVC框架|Handler处理器的三种写法

热门文章

  1. Java程序设计(Java9版):第1章 Java开发环境配置 (Set up Java development environment)
  2. 51单片机(十七)红外遥控(外部中断)
  3. 如何找到并彻底删除万能恢复大师、鲁大师等流氓软件
  4. 996 与 11-5-5
  5. 阻塞队列(ArrayBlockingQueue) 迭代器源码分析
  6. JavaWeb项目之Servlet+Mysql快递驿站(后台管理端+微信端)
  7. 笛卡尔在Excel中的连接使用
  8. 我快 30 了,前途在哪里?
  9. 怎么启用计算机服务设置,Win7打印机服务怎么开启 Win7开启打印机服务的设置的两种方法...
  10. hive-分析、窗口函数的使用