SkeyeWebPlayer.js H5播放器开发之播放器控制栏部分功能的实现

Posted OpenSKEYE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SkeyeWebPlayer.js H5播放器开发之播放器控制栏部分功能的实现相关的知识,希望对你有一定的参考价值。

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
  • 十分低开销,并且通过你的浏览器进行硬件加速
  • 支持全屏或比例显示;
  • 支持播放器快照截图;
  • 支持androidios播放;

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

(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播放器开发之播放器控制栏部分功能的实现的主要内容,如果未能解决你的问题,请参考以下文章

SkeyeWebPlayer.js H5播放器开发之播放器控制栏部分功能的实现

SkeyeWebPlayer.js H5播放器开发之播放器控制栏部分功能的实现

h5 video 视频播放开发 和 问题集合

♥基于H5+js开发一款音乐播放器

vue的h5页面中使用视频播放插件

Anyoffice -HTML5大赛 悦心(基于H5开发安卓音乐app)-项目总结