摘自:http://blog.csdn.net/u011334685/article/details/42675179

说明:用系统自带的AVPlayer类实现一个简单的视频播放器。它既能播放本地视频,也能较流畅地播放网络视频。

首先要引入AVFoundation.framework框架;

播放器类.h文件代码如下:

[objc] view plaincopy
  1. #import <UIKit/UIKit.h>
  2. #import <AVFoundation/AVFoundation.h>
  3. @interface PlayView : UIView
  4. -(void)setPlayer:(AVPlayer *)myPlayer;
  5. -(void)playWith:(NSURL *)url;
  6. -(void)releasePlayer;
  7. @end

播放器类.m文件代码如下:

[objc] view plaincopy
  1. #import "PlayView.h"
  2. @interface PlayView()
  3. {
  4. UIView   *_bgView;
  5. //播放器
  6. AVPlayer *_player;
  7. //用于显示(控制)视频的播放进度
  8. UISlider *_progressSlider;
  9. }
  10. -(void)uiConfigWith:(CGRect)bframe;
  11. @end
  12. @implementation PlayView
  13. - (id)initWithFrame:(CGRect)frame
  14. {
  15. self = [super initWithFrame:frame];
  16. if (self) {
  17. [self uiConfigWith:frame];
  18. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayDidEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:_player.currentItem];
  19. }
  20. return self;
  21. }
  22. -(void)uiConfigWith:(CGRect)bframe
  23. {
  24. self.backgroundColor=[UIColor blackColor];
  25. _bgView=[[UIView alloc]initWithFrame:CGRectMake(0, bframe.size.height-50, bframe.size.width, 50)];
  26. _bgView.backgroundColor=[UIColor lightGrayColor];
  27. [self addSubview:_bgView];
  28. //播放暂停按钮
  29. UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  30. [playBtn setFrame:CGRectMake(0,0,100,50)];
  31. playBtn.backgroundColor=[UIColor whiteColor];
  32. playBtn.selected=YES;
  33. [playBtn setTitle:@"play" forState:UIControlStateNormal];
  34. [playBtn setTitle:@"pause" forState:UIControlStateSelected];
  35. [playBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  36. [playBtn addTarget:self action:@selector(playBtnClick:) forControlEvents:UIControlEventTouchUpInside];
  37. [_bgView addSubview:playBtn];
  38. _progressSlider= [[UISlider alloc] initWithFrame:CGRectMake(100,0,bframe.size.width-100,50)];
  39. _progressSlider.minimumValue = 0.0;
  40. _progressSlider.maximumValue = 1.0;
  41. [_progressSlider addTarget:self action:@selector(progressChange:) forControlEvents:UIControlEventValueChanged];
  42. [_bgView addSubview:_progressSlider];
  43. }
  44. //每个视图都对应一个层,改变视图的形状、动画效果\与播放器的关联等,都可以在层上操作
  45. //播放器支持的播放格式:mp4、mov(iPhone手机录制视频的默认格式) avi
  46. -(void)setPlayer:(AVPlayer *)myPlayer
  47. {
  48. AVPlayerLayer *playerLayer=(AVPlayerLayer *)self.layer;
  49. [playerLayer setPlayer:myPlayer];
  50. }
  51. //在调用视图的layer时,会自动触发layerClass方法,重写它,保证返回的类型是AVPlayerLayer
  52. +(Class)layerClass
  53. {
  54. return [AVPlayerLayer class];
  55. }
  56. -(void)playWith:(NSURL *)url
  57. {
  58. //加载视频资源的类
  59. AVURLAsset *asset = [AVURLAsset assetWithURL:url];
  60. //AVURLAsset 通过tracks关键字会将资源异步加载在程序的一个临时内存缓冲区中
  61. [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:^{
  62. //能够得到资源被加载的状态
  63. AVKeyValueStatus status = [asset statusOfValueForKey:@"tracks" error:nil];
  64. //如果资源加载完成,开始进行播放
  65. if (status == AVKeyValueStatusLoaded) {
  66. //将加载好的资源放入AVPlayerItem 中,item中包含视频资源数据,视频资源时长、当前播放的时间点等信息
  67. AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
  68. _player = [[AVPlayer alloc] initWithPlayerItem:item];
  69. //将播放器与播放视图关联
  70. [self setPlayer:_player];
  71. [_player play];
  72. //需要时时显示播放的进度
  73. //根据播放的帧数、速率,进行时间的异步(在子线程中完成)获取
  74. [_player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_global_queue(0, 0) usingBlock:^(CMTime time) {
  75. //获取时间
  76. //获取当前播放时间(根据帧数和播放速率,视频资源的总长度得到的CMTime)
  77. CMTime current = _player.currentItem.currentTime;
  78. //总时间
  79. CMTime dur =_player.currentItem.duration;
  80. //CMTimeGetSeconds 将描述视频时间的结构体转化为float(秒)
  81. float pro = CMTimeGetSeconds(current)/CMTimeGetSeconds(dur);
  82. //回到主线程刷新UI
  83. dispatch_async(dispatch_get_main_queue(), ^{
  84. //要考虑到代码的健壮性
  85. /*1、在向对象发送消息前,要判断对象是否为空
  86. *2、一些值(数组、控制中的属性值)是否越界的判断
  87. *3、是否对各种异常情况进行了处理(照片、定位 用户允许、不允许)
  88. *4、数据存储,对nil的判断或处理
  89. *5、对硬件功能支持情况的判断等
  90. */
  91. if (pro >=0 && pro <=1) {
  92. _progressSlider.value = pro;
  93. }
  94. });
  95. }];
  96. }
  97. }];
  98. }
  99. #pragma mark -------BtnClick---------
  100. -(void)playBtnClick:(UIButton *)btn
  101. {
  102. if (btn.selected==YES) { //暂停按钮被点击
  103. if (_player) {
  104. [_player pause];
  105. }
  106. btn.selected=NO;
  107. return;
  108. }
  109. //播放按钮被点击
  110. if (_player) {
  111. [_player play];
  112. }
  113. btn.selected=YES;
  114. return;
  115. }
  116. -(void)progressChange:(UISlider *)sl
  117. {
  118. //通过进度条控制播放进度
  119. if (!_player) {
  120. return;
  121. }
  122. CMTime dur = _player.currentItem.duration;
  123. float current = _progressSlider.value;
  124. //CMTimeMultiplyByFloat64 将总时长,当前进度,转化成为CMTime
  125. //seekToTime 跳转到指定的时间
  126. [_player seekToTime:CMTimeMultiplyByFloat64(dur, current)];
  127. }
  128. //销毁player
  129. -(void)releasePlayer
  130. {
  131. if (_player) {
  132. [_player pause];
  133. _player=nil;
  134. }
  135. [[NSNotificationCenter defaultCenter] removeObserver:self];
  136. for(int i=0;i<[_bgView.subviews count];i++)
  137. {
  138. UIView *view=[_bgView.subviews objectAtIndex:i];
  139. [view removeFromSuperview];
  140. view=nil;
  141. i--;
  142. }
  143. [_bgView removeFromSuperview];
  144. _bgView=nil;
  145. }
  146. #pragma mark ------Notification-------
  147. -(void)moviePlayDidEnd:(NSNotification*)notification
  148. {
  149. NSLog(@"视频播放完毕!");
  150. }
  151. @end

这个简单的视频播放器类就做好了。

在ViewController类中创建一个简单的按钮,点击按钮,调用PlayView类播放视频。

如果是网络视频,

[objc] view plaincopy
  1. NSURL *url = [NSURL URLWithString:@"http://123.com/123.mp4"];

如果是本地视频,

[objc] view plaincopy
  1. NSString *path=[[NSBundle mainBundle]pathForResource:@"123.mp4" ofType:nil];
  2. NSURL *url=[NSURL fileURLWithPath:path];

调用:

[objc] view plaincopy
  1. PlayView *playView=[[PlayView alloc] initWithFrame:CGRectMake(0, 0, 320, 300)];
  2. [playView playWith:url];
  3. [self.view addSubview:playView];

这样,视频就可以播放了!

iOS实现一个简单的视频播放器相关推荐

  1. 一个简单的视频播放器

    本文介绍一个简单的视频播放器的实现,主要功能是读取U盘视频文件,通过UI显示进行播放,包括UI的一些控制逻辑,由于以demo的形式实现,因此UI设计效果比较一般,主要实现对应的功能,下面就简单介绍下整 ...

  2. 用Android做的一个简单的视频播放器

    視頻播放器项目功能需求 1 项目概述 1.1 项目描述 視頻播放器(以及視頻管理系統)是一款由java(Swing,安卓和数据库)做的手机视频播放器,可以看手机本地的各种视频,通过按钮进入手机视频管理 ...

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

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

  4. HTML实例——简单的视频播放器

    前两篇博文我们学习了HTML的表单事件与实现一个鼠标点击时,tab栏切换的实例 今天我们来实现一个简单的视频播放器 HTML--表单事件 HTML举例-鼠标点击时,tab栏切换 <!DOCTYP ...

  5. MediaCodec、OpenGL、OpenSL/AudioTrack 实现一款简单的视频播放器

    概述 功能很简单,大致流程为: 1) MediaCodec 解码视频文件得到 YUV.PCM 数据 2) OpenGL 将 YUV 转为 RGB,并渲染到 Surface 上 3) OpenSL/Au ...

  6. 小强的HTML5移动开发之路(5)——制作一个漂亮的视频播放器

    在前面几篇文章中介绍了HTML5的特点和需要掌握的基础知识,下面我们开始真正的体验一下HTML5的优势,我们开始制作一个漂亮的视频播放器吧先别急,在开始制作之前先了解一下视频文件的基本知识. 一.视频 ...

  7. ArtVideoPlayer:一个灵活的视频播放器

    这是一个灵活的视频播放器. MediaPlayer与VideoView完全分开,可以替换为其他播放器内核,如ExoPlayer和ijkPlayer. 可以完全自定义播放器视图,我们称之为控制面板. 此 ...

  8. python写一个文件下载器_python使用tcp实现一个简单的下载器

    上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ...

  9. 利用MFC调用libvlc.dll作一个简单的播放器

    简单介绍MFC调用libvlc.dll作一个简单的播放器,抛砖引玉,各位VC++达人继续深入研究,Jeremiah对VC++确实不太感兴趣,所以就不做太深入的研究了. 2009.10.29修改:加入c ...

  10. spring诸如方式_一个简单的步进器,具有诸如下一步,返回和结束之类的简单动作,可以执行简单的表格

    spring诸如方式 Vue步进器. (Stepper for Vue.) A simple stepper with simple actions such as next, back and fi ...

最新文章

  1. 有没搞错?Java 对象不使用时要赋值为 null?
  2. 分库分表之 Sharding-JDBC 中间件,看这篇真的够了!
  3. 大话架构”阿里架构师的笔记——多研究些架构,少谈些框架
  4. 数据库服务器的文件结构6,以下数据库服务器的文件结构
  5. 中国9大民居建筑,你都认识吗?
  6. html网页加入一个按钮,在html网页设计中,一个“登录”按钮怎么编写代码?
  7. 第三章 深入分析Java Web中的中文编码问题
  8. Jenkins 持续集成平台构建之通过git提交代码
  9. 冲着名为Sundy的男人去麦子学院
  10. 软件开发过程与需求获取
  11. 动态规划解最长公共子串
  12. Assign arrow function to a variable before exporting as module default import/no-anonymous-default-
  13. 搭建一款属于自己的,微信/抖音小程序,通过广告赚钱
  14. 四足机器人步态规划(walk and trot)
  15. Win10:回收站删除文件找回
  16. 利用jsp内置对象实现的简易聊天室
  17. pycharm下django案例的环境搭建运行
  18. 帝企鹅变形记:腾讯发展的秘密
  19. 特斯拉OUT了?荷兰ZEP公司太阳能瓦已在多国销售
  20. Windows 搜索

热门文章

  1. 计算机操作知识试题及答案真题,计算机操作系统期末考试题及答案
  2. 在电脑上安装python-如何在自己的电脑上安装python的idle版 - 卡饭网
  3. 计算机一级考试wps教程视频教程,全国计算机等级考试一级WPS Office教程(2008年版)...
  4. 西安三星电子笔试面试
  5. 计量笔记(三) | 线性模型的拟合优度检验
  6. 解决win10学习汇编工具的烦恼——汇编学习工具DOSBox0.74的下载和使用(包含可用下载链接)
  7. 电力系统微型计算机继电保护2018,2018年4月高等教育自学考试电力系统微型计算机继电保护试题及答案.docx...
  8. Django深入模板引擎
  9. msm8953 单独编译bootloader、kernel和system,以及采用adb fastboot下载镜像的方法
  10. 计算机四级 网络工程师 考过指南