video基础介绍&封装react-video基础组件,ES6
好几个月没有写博客了,人都赖了,今天抽了一点时间把最近项目react中video整理了一下(感觉这个以后用的活比较多)
1.前三部部分详细归纳了video的基础知识,属性和功能;
2.第四部分是封装了一个video基础组件,所有事件都采用对外开放状态,在引入时可以直接书写用,小伙伴们可以直接参考example,对于其他属性比如是否采用浏览器控制条等,可以结合前三部分的梳理自己重新书写,这个要看具体项目要求。
<一> video基本知识
1. src -> 视频的属性;
2. poster -> 视频封面,没有播放时的封面
3. preload -> 预加载;
preload介绍:
此属性用于定义视频是否预加载。属性有三个可选择的值:none、metadata、auto。如果不使用此属性,默认为auto。
None:不进行预加载;
Metadata:部分预加载(包括尺寸,第一帧,曲目列表,持续时间等等);
Auto:全部预加载;
4. autoplay -> 自动播放;
5. loop -> 循环播放;
6. controls -> 浏览器自带控制条。
<二>video属性
来源: Media = document.getElementByid('video');
1.Media.cuttentTime = value -> 当前的播放位置,赋值可以改变位置;
2.Media.duration -> 当前资源长度,流返回无限;
3.Media.defaultPlaybackRate = value -> 默认的回放速度;
4.Media.playbackRate = value -> 当前的播放速度,设置后马上改变;
5.Media.played -> 返回已经播放的区域,TimeRanges(详情如下);
6.Media.seekable -> 返回可以seek的区域,TimeRanges(详情如下);
7. Media.ended -> 是否结束;
8.Media.autoPlay -> 是否自动播放;
9.Media.loop -> 是否循环播放;
10.Media.controls -> 是否有默认控制条;
11.Media.volume = value -> 返回当前音量,设置后可以马上改变;
12.Media.muted = value -> 静音,设置后马上改变。
13.TimeRanges简介
使用seekable属性返回代表视频、声频可移动播放部分的TimeRanges对象,TimeRanges对象 代表了用户操作滑条,进行选择播放的范围,为一时间段。
在TimeTanges事件中,针对视频、声频的播放部分,有表示开始点的start属性和结束点的end属性, 与currentTime相同, 容纳了以秒计算的实数值。start与end是以矩阵的形式存在的。
视频、声频完成缓冲前,用户可以操作滑条到任何位置。
该属性为只读属性。
1.loadstart -> 客户端开始请求数据
2.progress -> 客户端正在请求数据
3.suspend -> 延迟下载
4.abort -> 客户端主动终止下载(不是因为错误引起)
5.loadstart -> 客户端开始请求数据
6.error -> 请求数据时遇到错误
7.stalled -> 网速失速
8.play -> play()和autoplay开始播放时触发
9.pause -> pause()触发
10.loadedmetadata -> 成功获取资源长度
11.waiting -> 等待数据,并非错误
12.playing -> 开始回放
13.canplay -> 可以播放,但中途可能因为加载而暂停
14.canplaythrough -> 可以播放,歌曲全部加载完毕
15.seeking -> 寻找中
16.seeked -> 寻找完毕
17.timeupdate -> 播放时间改变
18.ended -> 播放结束
19.ratechange -> 播放速率改变
20.durationchange -> 资源长度改变
21.volumechange -> 音量改变
<四>终于见到活例子了
/*
* css 没有写,组件在自己使用的时候自己复写
* @return 方法
* -method {带on开头的事件是对外开放事件,所有事件在调用的地方用console.log()打印出来事件的目的,详情见参考)
* -onPlay() 开始播放
* -onPause() 暂停
* -onEnded() 播放完
* -onStalled() 网速不正常
* -onTimeupdate() 播放时间改变 // 类似input的change事件
* -onPlaying() 回播
* -onRatechange() 播放速率改变
* -onVolumechange() 播放音量改变
* @example
* <Video data={{...}} onPlay={_onPlay} onPause={_onPause} onEnded={_onEnded} onPlaying={_onPlaying} />
*/
class Video extends Component {
constructor(props){
super(props);
this.state = {
poster:'http://suo.im/DdnZw', //网址过长,可以压缩
videoSrc:'http://suo.im/3brxdp',
playWord:'播放',
paused:true
}
}
_checkFn(fn){
return (typeof fn=="function"?fn:function(){});
}
_readyVideo(){
let media = this.media,_this = this;
let onBeforePlay = _this._checkFn(_this.props.onBeforePlay),
onLoadstart = _this._checkFn(_this.props.onLoadstart),
onProgress = _this._checkFn(_this.props.onProgress),
onSuspend = _this._checkFn(_this.props.onSuspend),
onAbort = _this._checkFn(_this.props.onAbort),
onPlay = _this._checkFn(_this.props.onPlay),
onPause = _this._checkFn(_this.props.onPause),
onError = _this._checkFn(_this.props.onError),
onStalled = _this._checkFn(_this.props.onStalled),
onLoadedmetadata = _this._checkFn(_this.props.onLoadedmetadata),
onLoadeddata = _this._checkFn(_this.props.onLoadeddata),
onWaiting = _this._checkFn(_this.props.onWaiting),
onPlaying = _this._checkFn(_this.props.onPlaying),
onCanplay = _this._checkFn(_this.props.onCanplay),
onCanplaythrough = _this._checkFn(_this.props.onCanplaythrough),
onSeeking = _this._checkFn(_this.props.onSeeking),
onSeeked = _this._checkFn(_this.props.onSeeked),
onTimeupdate = _this._checkFn(_this.props.onTimeupdate),
onEnded = _this._checkFn(_this.props.onEnded),
onRatechange = _this._checkFn(_this.props.onRatechange),
onDurationchange = _this._checkFn(_this.props.onDurationchange),
onVolumechange = _this._checkFn(_this.props.onVolumechange);
media.addEventListener('loadstart',function(){
onLoadstart();
console.log('客户端开始请求数据')
},false);
media.addEventListener('progress',function(){
onProgress()
console.log('客户端正在请求数据')
},false);
media.addEventListener('suspend',function(){
onSuspend();
console.log('延迟下载')
},false);
media.addEventListener('abort',function(){
onAbort()
console.log('客户端主动终止下载(不是因为错误引起)')
},false);
media.addEventListener('error',function(){
onError();
console.log('请求数据时遇到错误')
},false);
media.addEventListener('stalled',function(){
onStalled();
console.log('网速失速')
},false);
media.addEventListener('play',function(){
onPlay();
console.log('初始播放')
console.log(_this.media.played,78999999999999)
},false);
media.addEventListener('pause',function(){
onPause();
console.log('初始暂停')
},false);
media.addEventListener('loadedmetadata',function(data){
onLoadedmetadata();
console.log('成功获取资源长度')
},false);
media.addEventListener('loadeddata',function(data){
onLoadeddata();
console.log('当前帧的数据加载完成且还没有足够的数据播放视频/音频(audio/video)的下一帧时触发')
},false);
media.addEventListener('waiting',function(){
onWaiting();
console.log('等待数据,并非错误')
},false);
media.addEventListener('playing',function(){
onPlaying();
console.log('开始回放')
},false);
media.addEventListener('canplay',function(){
onCanplay();
console.log('可以播放,但中途可能因为加载而暂停')
},false);
media.addEventListener('canplaythrough',function(){
onCanplaythrough();
console.log('可以播放,歌曲全部加载完毕')
},false);
media.addEventListener('seeking',function(){
onSeeking();
console.log('寻找中')
},false);
media.addEventListener('seeked',function(){
onSeeked();
console.log('寻找完毕')
},false);
media.addEventListener('timeupdate',function(){
onTimeupdate();
console.log('播放时间改变') // 类似input的change事件
},false);
media.addEventListener('ended',function(){
onEnded();
console.log('播放结束') // 类似input的blur事件
},false);
media.addEventListener('ratechange',function(){
onRatechange();
console.log('播放速率改变')
},false);
media.addEventListener('durationchange',function(){
onDurationchange();
console.log('资源长度改变')
},false);
media.addEventListener('volumechange',function(){
onVolumechange();
console.log('播放音量改变')
},false);
}
componentDidMount(){
this.media = this.refs.video;
this._readyVideo();
}
btnPlay(){
let _this = this;
// _this.media.controls = true; 是否有控制条,如果不用浏览器自带控制条,可以设置false,然后自己复写样式和功能
// _this.media.muted true不是静音 false有声音
if(_this.state.paused){
_this.media.play();
_this.setState({paused:false,playWord:'暂停'});
}else{
_this.media.pause();
_this.setState({paused:true,playWord:'播放'});
}
let obj = {
a:_this.media.currentTime,
b:_this.media.startTime,
c:_this.media.duration,
d:_this.media.defaultPlaybackRate,
e:_this.media.playbackRate,
f:_this.media.seekable,
g:_this.media.volume,
h:_this.media.muted
}
console.log(obj)
}
render() {
let _this = this;
return (
<div>
<video src={_this.state.videoSrc} controls ref='video' poster={this.state.poster} id='video'></video>
<button onClick={_this.btnPlay.bind(_this)}>{_this.state.playWord}</button>
</div>
);
}
}
export default Video;
video基础介绍&封装react-video基础组件,ES6的更多相关文章
- 封装 React Native 原生组件(iOS / Android)
封装 React Native 原生组件(iOS / Android) 在 React Native中,有很多种丰富的组件了,例如 ScrollView.FlatList.SectionList.Bu ...
- Web3D编程入门总结——WebGL与Three.js基础介绍
/*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...
- 36.React基础介绍——2019年12月24日
2019年12月24日16:47:12 2019年10月25日11:24:29 主要介绍react入门知识. 1.jsx语法介绍 1.1 介绍 jsx语法是一种类似于html标签的语法,它的作用相当于 ...
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...
- 【RN - 基础】之React Native组件的生命周期
下图描述了React Native中组件的生命周期: 从上图中可以看到,React Native组件的生命周期可以分为初始化阶段.存在阶段和销毁阶段. 实例化阶段 实例化阶段是React Native ...
- Flux --> Redux --> Redux React 入门 基础实例使用
本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...
- 高通camera结构(摄像头基础介绍)
摄像头基础介绍 一.摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中进 ...
- 诱人的 react 视频教程-基础篇(14 个视频)
诱人的 react 视频教程-基础篇(14 个视频) 诱人的 react 视频教程 - 基础篇 #1 介绍「07:25」 诱人的 react 视频教程 - 基础篇 #2 create-react-ap ...
- 1.react的基础
1.react:专注于UI得一个js库 2.选择使用框架得原因: 写起来简单方便了,但是从稳定性上考虑得话还是原生js要稳定,所以也有很多公司直接使用原生js,但是从开发周期上来说时间会长 之前再写页 ...
随机推荐
- git clone 某个链接时候报错Initialized empty Git repository in 不能克隆
查看下是不是git是不是1.7.1版本. git --version 使用 yum -y update 更新一下. 再使用git clone 虽然还是会提示这个报错,但是可以克隆了.亲测有效. git ...
- 设计模式php+java版本(1) 基础篇 七大原则
2019年9月6日11:15:46 关于设计模式,其实就是编程思想的一个体现,有比较完善的编程思想写出的项目代码和没有编程思想的写出的差距巨大,代码的可读性,可维护性,可扩展性天差地别,有些刚接触的编 ...
- node框架那些事儿
一.简单介绍 express:适合初学者,模版引擎,路由,中间件 koa2:核心中间件 eggjs:企业级应用框架 二.express 服务端框架,提供路由功能,异常处理.路由系统+中间件构成web开 ...
- nginx添加sticky模块-cookie保持会话
cookie不同于session,一个存于客户端,一个存于服务端. 环境nginx 1.8.0 centos6.X sticky:1.2.5 wget https://bitbucket.org/n ...
- Spring Boot 的Logback
Spring Boot 默认使用Logback记录日志 Spring Boot starter 都会默认引入spring-boot-starter-logging,不需要再引入 日志级别从高到低:TR ...
- [QT] - 图片查看器(数码相框)#工程源码
简介: 大学期间弄的一个小软件,当时是将该软件移植到嵌入式开发板使用的,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 打开软件 ] [ 打开图片 ] [ 图片可放大. ...
- python代码git上传
python代码git上传 1.每次上传代码之前需要先拉取线上的代码 操作如下:
- 小程序onShow
/** * 生命周期函数--监听页面加载 */ onLoad: function(options) { let that = this; const openid = app.globalData.o ...
- Java学习之旅(二):生病的狗1(逻辑推导)
前言:本篇文章属于个人笔记,例化了一些代码,不知是否合理,请指教. 中午看到一位同学的面试题,觉得很烧脑,烧脑不能一个人烧,要大家一起烧. 村子中有50个人,每人有一条狗.在这50条狗中有病狗(这种病 ...
- Word页眉实现首页不同、奇偶页不同 、更改页眉横线、页眉文字对齐 -- 视频教程(8)
1. 目标 目标1:实现页眉"首页不同,奇偶页不同" 目标2:更改页眉横线 目标3:页眉文字有三部分:第一部分左对齐,第二部分居中,第三部分右对齐 2. 教程 未完 ...... ...