iOS实现一个简单的视频播放器
摘自:http://blog.csdn.net/u011334685/article/details/42675179
说明:用系统自带的AVPlayer类实现一个简单的视频播放器。它既能播放本地视频,也能较流畅地播放网络视频。
首先要引入AVFoundation.framework框架;
播放器类.h文件代码如下:
- #import <UIKit/UIKit.h>
- #import <AVFoundation/AVFoundation.h>
- @interface PlayView : UIView
- -(void)setPlayer:(AVPlayer *)myPlayer;
- -(void)playWith:(NSURL *)url;
- -(void)releasePlayer;
- @end
播放器类.m文件代码如下:
- #import "PlayView.h"
- @interface PlayView()
- {
- UIView *_bgView;
- //播放器
- AVPlayer *_player;
- //用于显示(控制)视频的播放进度
- UISlider *_progressSlider;
- }
- -(void)uiConfigWith:(CGRect)bframe;
- @end
- @implementation PlayView
- - (id)initWithFrame:(CGRect)frame
- {
- self = [super initWithFrame:frame];
- if (self) {
- [self uiConfigWith:frame];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayDidEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:_player.currentItem];
- }
- return self;
- }
- -(void)uiConfigWith:(CGRect)bframe
- {
- self.backgroundColor=[UIColor blackColor];
- _bgView=[[UIView alloc]initWithFrame:CGRectMake(0, bframe.size.height-50, bframe.size.width, 50)];
- _bgView.backgroundColor=[UIColor lightGrayColor];
- [self addSubview:_bgView];
- //播放暂停按钮
- UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeCustom];
- [playBtn setFrame:CGRectMake(0,0,100,50)];
- playBtn.backgroundColor=[UIColor whiteColor];
- playBtn.selected=YES;
- [playBtn setTitle:@"play" forState:UIControlStateNormal];
- [playBtn setTitle:@"pause" forState:UIControlStateSelected];
- [playBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- [playBtn addTarget:self action:@selector(playBtnClick:) forControlEvents:UIControlEventTouchUpInside];
- [_bgView addSubview:playBtn];
- _progressSlider= [[UISlider alloc] initWithFrame:CGRectMake(100,0,bframe.size.width-100,50)];
- _progressSlider.minimumValue = 0.0;
- _progressSlider.maximumValue = 1.0;
- [_progressSlider addTarget:self action:@selector(progressChange:) forControlEvents:UIControlEventValueChanged];
- [_bgView addSubview:_progressSlider];
- }
- //每个视图都对应一个层,改变视图的形状、动画效果\与播放器的关联等,都可以在层上操作
- //播放器支持的播放格式:mp4、mov(iPhone手机录制视频的默认格式) avi
- -(void)setPlayer:(AVPlayer *)myPlayer
- {
- AVPlayerLayer *playerLayer=(AVPlayerLayer *)self.layer;
- [playerLayer setPlayer:myPlayer];
- }
- //在调用视图的layer时,会自动触发layerClass方法,重写它,保证返回的类型是AVPlayerLayer
- +(Class)layerClass
- {
- return [AVPlayerLayer class];
- }
- -(void)playWith:(NSURL *)url
- {
- //加载视频资源的类
- AVURLAsset *asset = [AVURLAsset assetWithURL:url];
- //AVURLAsset 通过tracks关键字会将资源异步加载在程序的一个临时内存缓冲区中
- [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:^{
- //能够得到资源被加载的状态
- AVKeyValueStatus status = [asset statusOfValueForKey:@"tracks" error:nil];
- //如果资源加载完成,开始进行播放
- if (status == AVKeyValueStatusLoaded) {
- //将加载好的资源放入AVPlayerItem 中,item中包含视频资源数据,视频资源时长、当前播放的时间点等信息
- AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
- _player = [[AVPlayer alloc] initWithPlayerItem:item];
- //将播放器与播放视图关联
- [self setPlayer:_player];
- [_player play];
- //需要时时显示播放的进度
- //根据播放的帧数、速率,进行时间的异步(在子线程中完成)获取
- [_player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_global_queue(0, 0) usingBlock:^(CMTime time) {
- //获取时间
- //获取当前播放时间(根据帧数和播放速率,视频资源的总长度得到的CMTime)
- CMTime current = _player.currentItem.currentTime;
- //总时间
- CMTime dur =_player.currentItem.duration;
- //CMTimeGetSeconds 将描述视频时间的结构体转化为float(秒)
- float pro = CMTimeGetSeconds(current)/CMTimeGetSeconds(dur);
- //回到主线程刷新UI
- dispatch_async(dispatch_get_main_queue(), ^{
- //要考虑到代码的健壮性
- /*1、在向对象发送消息前,要判断对象是否为空
- *2、一些值(数组、控制中的属性值)是否越界的判断
- *3、是否对各种异常情况进行了处理(照片、定位 用户允许、不允许)
- *4、数据存储,对nil的判断或处理
- *5、对硬件功能支持情况的判断等
- */
- if (pro >=0 && pro <=1) {
- _progressSlider.value = pro;
- }
- });
- }];
- }
- }];
- }
- #pragma mark -------BtnClick---------
- -(void)playBtnClick:(UIButton *)btn
- {
- if (btn.selected==YES) { //暂停按钮被点击
- if (_player) {
- [_player pause];
- }
- btn.selected=NO;
- return;
- }
- //播放按钮被点击
- if (_player) {
- [_player play];
- }
- btn.selected=YES;
- return;
- }
- -(void)progressChange:(UISlider *)sl
- {
- //通过进度条控制播放进度
- if (!_player) {
- return;
- }
- CMTime dur = _player.currentItem.duration;
- float current = _progressSlider.value;
- //CMTimeMultiplyByFloat64 将总时长,当前进度,转化成为CMTime
- //seekToTime 跳转到指定的时间
- [_player seekToTime:CMTimeMultiplyByFloat64(dur, current)];
- }
- //销毁player
- -(void)releasePlayer
- {
- if (_player) {
- [_player pause];
- _player=nil;
- }
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- for(int i=0;i<[_bgView.subviews count];i++)
- {
- UIView *view=[_bgView.subviews objectAtIndex:i];
- [view removeFromSuperview];
- view=nil;
- i--;
- }
- [_bgView removeFromSuperview];
- _bgView=nil;
- }
- #pragma mark ------Notification-------
- -(void)moviePlayDidEnd:(NSNotification*)notification
- {
- NSLog(@"视频播放完毕!");
- }
- @end
这个简单的视频播放器类就做好了。
在ViewController类中创建一个简单的按钮,点击按钮,调用PlayView类播放视频。
如果是网络视频,
- NSURL *url = [NSURL URLWithString:@"http://123.com/123.mp4"];
如果是本地视频,
- NSString *path=[[NSBundle mainBundle]pathForResource:@"123.mp4" ofType:nil];
- NSURL *url=[NSURL fileURLWithPath:path];
调用:
- PlayView *playView=[[PlayView alloc] initWithFrame:CGRectMake(0, 0, 320, 300)];
- [playView playWith:url];
- [self.view addSubview:playView];
这样,视频就可以播放了!
iOS实现一个简单的视频播放器相关推荐
- 一个简单的视频播放器
本文介绍一个简单的视频播放器的实现,主要功能是读取U盘视频文件,通过UI显示进行播放,包括UI的一些控制逻辑,由于以demo的形式实现,因此UI设计效果比较一般,主要实现对应的功能,下面就简单介绍下整 ...
- 用Android做的一个简单的视频播放器
視頻播放器项目功能需求 1 项目概述 1.1 项目描述 視頻播放器(以及視頻管理系統)是一款由java(Swing,安卓和数据库)做的手机视频播放器,可以看手机本地的各种视频,通过按钮进入手机视频管理 ...
- iOS 教你使用MP、AVPlayer、AVPlayerVC构建一个完整的视频播放器
1.前言 标题必须要浮夸!要感觉像是一个大新闻.长者如是说. 其实是前几天去面试的时候,被要求说必须做过视频播放相关项目.有点闹心之余,就花了点时间在家写了一个简单播放器,基本实现了主流播放器的大致功 ...
- HTML实例——简单的视频播放器
前两篇博文我们学习了HTML的表单事件与实现一个鼠标点击时,tab栏切换的实例 今天我们来实现一个简单的视频播放器 HTML--表单事件 HTML举例-鼠标点击时,tab栏切换 <!DOCTYP ...
- MediaCodec、OpenGL、OpenSL/AudioTrack 实现一款简单的视频播放器
概述 功能很简单,大致流程为: 1) MediaCodec 解码视频文件得到 YUV.PCM 数据 2) OpenGL 将 YUV 转为 RGB,并渲染到 Surface 上 3) OpenSL/Au ...
- 小强的HTML5移动开发之路(5)——制作一个漂亮的视频播放器
在前面几篇文章中介绍了HTML5的特点和需要掌握的基础知识,下面我们开始真正的体验一下HTML5的优势,我们开始制作一个漂亮的视频播放器吧先别急,在开始制作之前先了解一下视频文件的基本知识. 一.视频 ...
- ArtVideoPlayer:一个灵活的视频播放器
这是一个灵活的视频播放器. MediaPlayer与VideoView完全分开,可以替换为其他播放器内核,如ExoPlayer和ijkPlayer. 可以完全自定义播放器视图,我们称之为控制面板. 此 ...
- python写一个文件下载器_python使用tcp实现一个简单的下载器
上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ...
- 利用MFC调用libvlc.dll作一个简单的播放器
简单介绍MFC调用libvlc.dll作一个简单的播放器,抛砖引玉,各位VC++达人继续深入研究,Jeremiah对VC++确实不太感兴趣,所以就不做太深入的研究了. 2009.10.29修改:加入c ...
- spring诸如方式_一个简单的步进器,具有诸如下一步,返回和结束之类的简单动作,可以执行简单的表格
spring诸如方式 Vue步进器. (Stepper for Vue.) A simple stepper with simple actions such as next, back and fi ...
最新文章
- 有没搞错?Java 对象不使用时要赋值为 null?
- 分库分表之 Sharding-JDBC 中间件,看这篇真的够了!
- 大话架构”阿里架构师的笔记——多研究些架构,少谈些框架
- 数据库服务器的文件结构6,以下数据库服务器的文件结构
- 中国9大民居建筑,你都认识吗?
- html网页加入一个按钮,在html网页设计中,一个“登录”按钮怎么编写代码?
- 第三章 深入分析Java Web中的中文编码问题
- Jenkins 持续集成平台构建之通过git提交代码
- 冲着名为Sundy的男人去麦子学院
- 软件开发过程与需求获取
- 动态规划解最长公共子串
- Assign arrow function to a variable before exporting as module default import/no-anonymous-default-
- 搭建一款属于自己的,微信/抖音小程序,通过广告赚钱
- 四足机器人步态规划(walk and trot)
- Win10:回收站删除文件找回
- 利用jsp内置对象实现的简易聊天室
- pycharm下django案例的环境搭建运行
- 帝企鹅变形记:腾讯发展的秘密
- 特斯拉OUT了?荷兰ZEP公司太阳能瓦已在多国销售
- Windows 搜索
热门文章
- 计算机操作知识试题及答案真题,计算机操作系统期末考试题及答案
- 在电脑上安装python-如何在自己的电脑上安装python的idle版 - 卡饭网
- 计算机一级考试wps教程视频教程,全国计算机等级考试一级WPS Office教程(2008年版)...
- 西安三星电子笔试面试
- 计量笔记(三) | 线性模型的拟合优度检验
- 解决win10学习汇编工具的烦恼——汇编学习工具DOSBox0.74的下载和使用(包含可用下载链接)
- 电力系统微型计算机继电保护2018,2018年4月高等教育自学考试电力系统微型计算机继电保护试题及答案.docx...
- Django深入模板引擎
- msm8953 单独编译bootloader、kernel和system,以及采用adb fastboot下载镜像的方法
- 计算机四级 网络工程师 考过指南