好几个月没有写博客了,人都赖了,今天抽了一点时间把最近项目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 --> 参考一  参考二  参考三  参考四

video基础介绍&封装react-video基础组件,ES6的更多相关文章

  1. 封装 React Native 原生组件(iOS / Android)

    封装 React Native 原生组件(iOS / Android) 在 React Native中,有很多种丰富的组件了,例如 ScrollView.FlatList.SectionList.Bu ...

  2. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

  3. 36.React基础介绍——2019年12月24日

    2019年12月24日16:47:12 2019年10月25日11:24:29 主要介绍react入门知识. 1.jsx语法介绍 1.1 介绍 jsx语法是一种类似于html标签的语法,它的作用相当于 ...

  4. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  5. 【RN - 基础】之React Native组件的生命周期

    下图描述了React Native中组件的生命周期: 从上图中可以看到,React Native组件的生命周期可以分为初始化阶段.存在阶段和销毁阶段. 实例化阶段 实例化阶段是React Native ...

  6. Flux --> Redux --> Redux React 入门 基础实例使用

    本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...

  7. 高通camera结构(摄像头基础介绍)

    摄像头基础介绍 一.摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中进 ...

  8. 诱人的 react 视频教程-基础篇(14 个视频)

    诱人的 react 视频教程-基础篇(14 个视频) 诱人的 react 视频教程 - 基础篇 #1 介绍「07:25」 诱人的 react 视频教程 - 基础篇 #2 create-react-ap ...

  9. 1.react的基础

    1.react:专注于UI得一个js库 2.选择使用框架得原因: 写起来简单方便了,但是从稳定性上考虑得话还是原生js要稳定,所以也有很多公司直接使用原生js,但是从开发周期上来说时间会长 之前再写页 ...

随机推荐

  1. docker 国内镜像加速

    CentOS7 对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件): {"registry-mirrors& ...

  2. JAVA SpringBoot2 整合 ueditor 的 并实现前后端分离

    1,下载 jsp 版本的 百度编辑器,点击此处下载 2,解压文件,解压后目录如下 3,我们将 jsp 目录暂时移动到别的地方,剩下的文件作为一个 H5 前端项目使用,笔者这边导入到 idea 进行开发 ...

  3. U盘安装Windows Server2008 R2

    安装Windows 2008 r2 提示windows 无法安装到这个磁盘.选中的磁盘采用GPT分区形式 利用U盘装系统的步骤 第一 进入BIOS,找SECURITY—SECURE BOOT中的SEC ...

  4. dd命令的使用

    1.dd命令的使用 dd命令用于复制文件并对源文件的内容进行转换和格式化处理,在有需要的时候可以使用dd命令对物理磁盘进行操作,使用dd对磁盘操作时,最好使用块设备文件. (1)命令语法 dd (选项 ...

  5. 前端与算法 leetcode 27.移除元素

    目录 # 前端与算法 leetcode 27.移除元素 题目描述 概要 提示 解析 算法 @(目录) # 前端与算法 leetcode 27.移除元素 题目描述 27.移除元素 概要 题目本身其实挺简 ...

  6. Java 中成员变量被局部变量所隐藏

    Java 中局部变量与成员变量同名时,局部变量会隐藏成员变量.如果我们想访问成员变量,可以使用 this 关键字. class Test { private int value = 10; void ...

  7. C++的菱形继承会发生什么问题?如何解决?画出其内存布局图

    菱形继承问题样例: #include <iostream> using namespace std; class A { public: ; virtual int getx() { re ...

  8. Windows下编译Redis5.0.5

    先去弄Cygwin环境 http://www.cygwin.com/ 下载完成 打开 下一步 下一步 下一步 下一步 下一步,出现一个界面,让你添加地址,你打开官网,选择mirror sites,点击 ...

  9. elasticsearch 常见查询及聚合的JAVA API

    ES 常见查询 (1)根据ID 进行单个查询 GetResponse response = client.prepareGet("accounts", "person&q ...

  10. Word章 节标题自动编号并由此自动生成目录 -- 含视频教程(1)

    1. 写论文之前事先调好 写论文的时候,难免要用到章节,如何实现下图的效果呢? 其实结合用好两个功能就行了: >> 视频教程链接:B站,速度快,清晰 事先调好,可以给后续工作带来很多便利, ...