SkeyeWebPlayer.js H5免费播放器

  • 支持Websocket-RTSP播放;
  • 支持 m3u8(HLS) 播放;
  • 支持 HTTP-FLV/WS-FLV 播放;
  • 支持 HEVC/H265 播放;
  • 支持直播和点播播放;
  • 支持全屏显示;
  • 支持重连播放;
  • 具有 H.264 + AAC 编解码器播放功能
  • HTTP FLV RTSP低延迟实时流播放 (HLS延时稍大一点,大概在2s—3s左右)
  • WS-FLV 通过 WebSocket 实时流播放
  • 兼容 Chrome, FireFox, Safari IE11 和 Edge
  • 十分低开销,并且通过你的浏览器进行硬件加速
  • 支持全屏或比例显示;
  • 支持播放器快照截图;
  • 支持Android、iOS播放;

本节将实现播放器的控制栏及其功能的实现。效果图如下:

(1)、我把控制栏的每一个小功能放到一个单独的js内,最后在统一到control-bar里面进行统一的管理,这样做管理方便,操作简单。如下图目录结构:

(2)、控制栏所使用的图标可以使用图片,和font字体图标,字体图标到相关的网站下载即可(例如:Iconfont-阿里巴巴矢量图标库):

(3)、控制栏分左、中、右,3个部分,

  • 左边部分:播放/暂停按钮、停止、声音、以及一个LIVE的标志。
  • 右边部分:视频画面拉伸/按比例显示、快照下载、全屏/还原。
  • 中间部分:有一个视频播放的进度条,对视频文件播放时,才显示,(回放,等)

(4)、实现样式

  • 首先创建最外部div,和左中右 3个div

      let controlBarEl = this.createEl('div', {className: 'vss-control-bar'});let controlBarLeftEl = this.createEl('div', {className: 'vss-control-bar-left'});let controlBarConterEl = this.createEl('div', {className: 'vss-control-bar-conter'});let controlBarrRightEl = this.createEl('div', {className: 'vss-control-bar-right'});
    
  • 播放按钮play-btn.js的相关代码如下:

    (1)、dom.js的内容代码放在最下面

    (2)、同封装的createEl方法创建好元素,绑定click事件来控制播放的状态

    (3)、self.on(‘status’, fun) 来监听 播放状态的变化,来控制显示播放或暂停按钮

      /*** play-btn.js*/import {createEl} from '../utils/dom';class PlayBtn {constructor(self, dom) {this.boxDom = self.boxDom;this.isFill = false;this.isPlaying = false;this.PlayBtnEl = createEl('div',{className: 'vss-btn-group vss-pointer'},{});this.IconEl = createEl('span',{className: 'vssfont vss-play'},{title: '播放'});this.PlayBtnEl.appendChild(this.IconEl);dom.appendChild(this.PlayBtnEl);this.PlayBtnEl.onclick = (e) => {if (self.url) {if (this.isPlaying) {this.isPlaying = false;this.PlayBtnEl.title = '播放';this.PlayBtnEl.classList.remove('vss-pause');this.PlayBtnEl.classList.add('vss-play');this.pause(self);} else {this.isPlaying = true;this.PlayBtnEl.title = '暂停';this.PlayBtnEl.classList.remove('vss-play');this.PlayBtnEl.classList.add('vss-pause');this.play(self);}} else {console.log('url is empty');}};self.on('status', (status) => {if (status === 100) {this.isPlaying = true;this.PlayBtnEl.title = '暂停';this.PlayBtnEl.classList.remove('vss-play');this.PlayBtnEl.classList.add('vss-pause');}});}// 播放play(self) {self.play(self.url, 1, self.seekTimeSecs);}// 暂停pause(self) {self.pause();}}export default PlayBtn;
    
  • 全屏按钮fullscreen-toggle.js的相关代码如下,在操作全屏与取消全屏控制时需要注意:

    (1)、开启全屏是使用 this.boxDom.requestFullscreen() ,this.boxDom是表示播放器容器的这个元素,对他调用requestFullscreen方法。

    (2)、但是在取消全屏的时候 是使用 document.exitFullscreen(); 是对document进行操作,这两个操作的对象需要注意一下,别搞错了。

      /*** fullscreen-toggle.js*/import {createEl} from '../utils/dom';class FullscreenToggle {constructor(self, dom) {this.boxDom = self.boxDom;this.isFullScreen = false;this.fullScreenBtnEl = createEl('div', {className: 'vss-full-screen-btn vss-pointer'}, {});this.fullScreenIconEl = createEl('span', {className: 'vssfont vss-fullscreen'}, {title: '全屏'});this.fullScreenBtnEl.appendChild(this.fullScreenIconEl);dom.appendChild(this.fullScreenBtnEl);this.fullScreenBtnEl.onclick = (e) => {if (this.isFullScreen) {// 取消全屏this.isFullScreen = false;self.callbackFunc('unFull');this.fullScreenIconEl.title = '全屏';this.fullScreenIconEl.classList.remove('vss-cancel-fullscreen');this.fullScreenIconEl.classList.add('vss-fullscreen');this.exitFullScreen();} else {// 全屏this.isFullScreen = true;self.callbackFunc('full');this.fullScreenIconEl.title = '取消全屏';this.fullScreenIconEl.classList.remove('vss-fullscreen');this.fullScreenIconEl.classList.add('vss-cancel-fullscreen');this.requestFullscreen();}};// 监听播放器是否为全屏状态// document.addEventListener('fullscreenchange', function (e) {//// });}// 全屏requestFullscreen() {if (this.boxDom.requestFullscreen) {this.boxDom.requestFullscreen();} else if (this.boxDom.mozRequestFullScreen) {this.boxDom.mozRequestFullScreen();} else if (this.boxDom.webkitRequestFullscreen) {this.boxDom.webkitRequestFullscreen();} else if (this.boxDom.msRequestFullscreen) {this.boxDom.msRequestFullscreen();}}// 取消全屏exitFullScreen() {if (document.exitFullscreen) {document.exitFullscreen();} else if (document.msExitFullscreen) {document.msExitFullscreen();} else if (document.mozCancelFullScreen) {document.mozCancelFullScreen();} else if (document.webkitCancelFullScreen) {document.webkitCancelFullScreen();}}}export default FullscreenToggle;
    
  • 其他的我就不一一描述了,与上面的写法基本差不多,最后在放一个dom.js。

      export function isObject(value) {return !!value && typeof value === 'object';}export function isEl(value) {return isObject(value) && value.nodeType === 1;}export function isTextNode(value) {return isObject(value) && value.nodeType === 3;}export function normalizeContent(content) {// First, invoke content if it is a function. If it produces an array,// that needs to happen before normalization.if (typeof content === 'function') {content = content();}// Next up, normalize to an array, so one or many items can be normalized,// filtered, and returned.return (Array.isArray(content) ? content : [content]).map(value => {// First, invoke value if it is a function to produce a new value,// which will be subsequently normalized to a Node of some kind.if (typeof value === 'function') {value = value();}if (isEl(value) || isTextNode(value)) {return value;}if (typeof value === 'string' && (/\S/).test(value)) {return document.createTextNode(value);}}).filter(value => value);}export function appendContent(el, content) {normalizeContent(content).forEach(node => el.appendChild(node));return el;}/*** 创建元素并应用属性、属性和插入内容.* @param  {string} [tagName='div'] 要创建的标记的名称.* @param  {Object} [properties={}] 要应用的元素属性.* @param  {Object} [attributes={}] 要应用的元素属性.* @param {string} [content] 内容描述符对象.* @return {Element} 创建的元素.*/export function createEl(tagName = 'div', properties = {}, attributes = {}, content) {const el = document.createElement(tagName);Object.getOwnPropertyNames(properties).forEach(function (propName) {const val = properties[propName];if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {// log.warn('Setting attributes in the second argument of createEl()\n' +//     'has been deprecated. Use the third argument instead.\n' +//     `createEl(type, properties, attributes). Attempting to set ${propName} to ${val}.`);el.setAttribute(propName, val);} else if (propName === 'textContent') {// textContent(el, val);} else if (el[propName] !== val || propName === 'tabIndex') {el[propName] = val;}});Object.getOwnPropertyNames(attributes).forEach(function (attrName) {el.setAttribute(attrName, attributes[attrName]);});if (content) {appendContent(el, content);}return el;}
    

val;
}
});

     Object.getOwnPropertyNames(attributes).forEach(function (attrName) {el.setAttribute(attrName, attributes[attrName]);});if (content) {appendContent(el, content);}return el;}
  • 如有错误还请大家指正。

SkeyeWebPlayer.js H5播放器开发之播放器控制栏部分功能的实现(四)相关推荐

  1. SkeyeWebPlayer.js H5播放器开发之播放器video动态创建(三)

    SkeyeWebPlayer.js H5播放器是由成都视开信息科技开发和维护的一个完善的RTSP.FLV.HLS等多种流媒体协议播放,视频编码支持H.264,H.265,音频支持AAC,支持TCP/U ...

  2. SkeyeWebPlayer.js H5播放器是怎么样炼成的

    SkeyeWebPlayer.js H5播放器是由成都视开信息科技开发和维护的一个完善的RTSP.FLV.HLS等多种流媒体协议播放,视频编码支持H.264,H.265,音频支持AAC,支持TCP/U ...

  3. SkeyeWebPlayer.js H5播放器开发之webpack编译flv.js实现基础播放器功能(二)

    SkeyeWebPlayer.js H5播放器是由成都视开信息科技开发和维护的一个完善的RTSP.FLV.HLS等多种流媒体协议播放,视频编码支持H.264,H.265,音频支持AAC,支持TCP/U ...

  4. SkeyeWebPlayer.js H5播放器开发之webpack项目创建级编译配置(一)

    SkeyeWebPlayer.js H5播放器开发之播放器动态渲染video. 动态渲染是采用js进行创建dom.添加dom.添加class.style等方式操作dom元素.最终将播放器编译成成一个独 ...

  5. SkeyeWebPlayer.js H5播放器使用文档说明

    SkeyeWebPlayer.js H5播放器,是一款能够同时支持HTTP.HTTP-FLV.HLS(m3u8)视频直播与视频点播等多种协议, 支持H.264.H.265.AAC等多种音视频编码格式, ...

  6. Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…)

    1. 说明 源码已同步到Gitee仓库,Github仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. Android播放器专栏其它文章: 服务端:Android音乐播放器开发 ...

  7. android音乐播放器开发 SweetMusicPlayer 播放本地音乐

    代码地址:https://github.com/huweigoodboy/SweetMusicPlayer 上一篇写了加载歌曲列表,http://blog.csdn.net/huweigoodboy/ ...

  8. 【Android 逆向】代码调试器开发 ( 代码调试器功能简介 | 设置断点 | 读写内存 | 读写寄存器 | 恢复运行 | Attach 进程 )

    文章目录 一.代码调试器功能简介 二.Attach 进程 一.代码调试器功能简介 代码调试器功能 : 设置断点 : 无论什么类型的调试器 , 都必须可以设置断点 , 运行到断点处 , 挂起被调试进程 ...

  9. MFC+DuiVision结合VLC播放器开发直播客户端

    MFC+DuiVision结合VLC播放器开发直播客户端 说明:windows 10 VS2015社区版 关键字:c++ VisualStudio DuiVision VLC播放器 开发这个视频播放器 ...

最新文章

  1. iphone如何信任软件_你还在用大众点评吗?评价软件失去信任还如何活下去
  2. java String pool
  3. JavaScript编码encode和decode escape和unescape
  4. C#读取EXIF信息类
  5. 不搞代码来搞我,我又动了谁的奶酪?
  6. 进程线程与栈、堆的关系
  7. html 文章阅读次数,关于浏览次数和浏览次数缓存的问题
  8. Android 5.0 十大新特性
  9. Grails 基础环境搭建及HelloWorld
  10. 男子常用英文名及含义
  11. webgame php源码,最WEB游戏源码服务端(完整修改版).doc
  12. windows 豆沙绿参数
  13. 腾讯微博qq说说备份导出工具_10年过去了,腾讯微博终于被判了死刑。。。
  14. 如何正确nandflash的块地址和页地址
  15. python - 1024 Spider
  16. PTA不变初心数(17分)简单答案版
  17. 国际风筝节开幕 深圳大梅沙上演嫦娥奔月(图)
  18. 免企业资质免签约支付
  19. 瞬时频率函数matlab,Hilbert 变换与瞬时频率
  20. 记一次 Centos7.x Hadoop3.x集群安装部署 Pig 0.17.0

热门文章

  1. codepen中html如何引用图片,源自codepen的25个最受欢迎的HTML/CSS 代码
  2. Linux SMB服务器配置
  3. uni-app获取input框的value值
  4. Linux回收站的设计与实现
  5. 【苹果相册推】专门用作家庭推可增加的UDID
  6. 小米为什么把智能家居定义为“轻智能”?
  7. 名帖190 米芾 行书《多景楼诗册》
  8. safari浏览器_浏览器趋势2015年7月:Safari停滞了吗?
  9. Pytorch 返回U-Net中间latent层结果的一种方法
  10. Lucene 索引文件的合并(四)之kddkdikdm