vue+node 实现视频在线播放的实例代码


Posted in Javascript onOctober 19, 2020

1.node服务端

数据流传输,可在线缓存

//获取参数
  var params=urldeal.parse(req.url,true).query
  const ROOT_PATH = process.cwd();//必须使用绝对路径,使用相对路径会直接下载文件
  let path =ROOT_PATH+params.url;

  let stat = fs.statSync(path); //获取文件信息
  let fileSize = stat.size;
  let range = req.headers.range;

  if (range) {
    //有range头才使用206状态码

    let parts = range.replace(/bytes=/, "").split("-");
    let start = parseInt(parts[0], 10);
    let end = parts[1] ? parseInt(parts[1], 10) : start + 9999999;

    // end 在最后取值为 fileSize - 1
    end = end > fileSize - 1 ? fileSize - 1 : end;

    let chunksize = (end - start) + 1;
    let file = fs.createReadStream(path, { start, end });
    let head = {
      'Content-Range': `bytes ${start}-${end}/${fileSize}`,
      'Accept-Ranges': 'bytes',
      'Content-Length': chunksize,
      'Content-Type': 'video/mp4',
    };
    res.writeHead(206, head);
    file.pipe(res);     //Node中的Server端HTTP response是Writable流
  } else {
    let head = {
      'Content-Length': fileSize,
      'Content-Type': 'video/mp4',
    };
    res.writeHead(200, head);
    fs.createReadStream(path).pipe(res);
  }

2.vue客户端

1.安装video-player插件

cnpm install vue-video-player --save

2.组件中引用

<video-player class="video-player vjs-custom-skin"
         ref="videoPlayer"
         :playsinline="true"
         :options="playerOptions"
 ></video-player>

3.调用的data中的数据

data() {
  return {
   // 视频播放
   playerOptions: {
    playbackRates: [0.5, 1.0, 1.5, 2.0], //播放速度
    autoplay: false, //如果true,浏览器准备好时开始回放。
    muted: false, // 默认情况下将会消除任何音频。
    loop: false, // 导致视频一结束就重新开始。
    preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
    language: 'zh-CN',
    aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
    fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
    sources: [{
     type: "",
     //src: require('@/assets/'+this.vurl)//url地址
      src: 'http://localhost:10086/videos?url=/public/videos/'+this.vurl, //url地址,请求中需要包含具体的视频文件名
    }],
    poster: '', //你的封面地址
    // width: document.documentElement.clientWidth,
    notSupportedMessage: '此视频暂无法播放,请稍后再试', //允许覆盖Video.js无法播放媒体源时显示的默认信息。
    controlBar: {
     timeDivider: true,
     durationDisplay: true,
     remainingTimeDisplay: false,
     fullscreenToggle: true //全屏按钮
    }
   }
  }
 },

附录:vue+flvjs播放直播流FLV,分页时如何断开之前直播流解决办法

使用flvjs库同时播放flv文件,需要分页发现,之前直播流没有断开,很影响性能,网上查阅借鉴下边代码实现断开上页直播流

// 销毁播放器实例
  closePlayer() {
   if (this.player.length > 0) {
    this.player.forEach((item) => {
     item.destroy(true);
     item.off('ended', function () {});
     item.off('error', function () {});
     item = null;
    });
    this.player = [];
   }
  },
// 初始化播放器
  initPlayer(id, url, img) {
   let doms = document.getElementById(id);
   doms.innerHTML = '';
   this.player.push(
    new FlvPlayer({
     id: id,
     url: url,
     poster: img,
     isLive: true,
     autoplay: true,
     volume: id == 'videos0' ? 0.5 : 0,
     preloadTime: 10,
     minCachedTime: 5,
     cors: true,
    })
   );
   this.player[this.player.length - 1].on('ended', () => {
    //事件名称可以在上述查询
    this.getLivingList();
   });
   this.player[this.player.length - 1].on('error', () => {
    //事件名称可以在上述查询
    this.getLivingList();
   });
  },
// 翻页操作
  currentChange(e) {
   this.closePlayer();
   this.pageno = e;
   this.getLivingList();
  },
  // 获取直播中的列表
  async getLivingList() {
   let res = await this.$req(api.liveShowers, {
    ...this.searchForm,
    pageno: this.pageno - 1,
    pagesize: this.pagesize,
   });
   console.log(res);
   if (res.code == 200) {
    // 获取到数据,赋值然后循环实例化
    res.data.showers.push(res.data.showers[0]);
    res.data.showers.push(res.data.showers[0]);
    res.data.showers.push(res.data.showers[0]);
    res.data.showers.push(res.data.showers[0]);
    this.livingList = res.data.showers;
    this.totalP = res.data.total_page - 0;
    this.totalS = res.data.total_showers;
    this.isrefresh = false;
    if (this.livingList.length > 0) {
     setTimeout(() => {
      this.livingList.forEach((item, idx) => {
       let domid = 'videos' + idx;
       this.initPlayer(
        domid,
        item.play_url,
        this.$store.state.coverTop + item.showcover
       );
      });
     }, 400);
    } else {
     // 如果返回没有直播数据又不是第一页。就跳到第一页再请求一下
     if (this.pageno > 1) {
      this.pageno = 1;
      this.getLivingList();
     }
    }
   }
  },

总结

到此这篇关于vue+node 实现视频在线播放的实例代码的文章就介绍到这了,更多相关vue视频在线播放内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery实现contains方法不区分大小写的方法
Feb 13 Javascript
JS上传图片前实现图片预览效果的方法
Mar 02 Javascript
javascript制作幻灯片(360度全景图片)
Jul 28 Javascript
jQuery平滑旋转幻灯片特效代码分享
Sep 07 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
Nov 17 Javascript
jQuery Validate验证框架详解(推荐)
Dec 17 Javascript
javascript实现去除HTML标签的方法
Dec 26 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
vue动态改变背景图片demo分享
Sep 13 Javascript
Node.js爬虫如何获取天气和每日问候详解
Aug 26 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
Sep 17 Javascript
el-table-column 内容不自动换行的解决方法
Aug 14 Vue.js
js实现网页随机验证码
Oct 19 #Javascript
JS实现4位随机验证码
Oct 19 #Javascript
如何编写一个 Webpack Loader的实现
Oct 18 #Javascript
JavaScript中EventBus实现对象之间通信
Oct 18 #Javascript
vuex刷新后数据丢失的解决方法
Oct 18 #Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 #Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
Oct 18 #Javascript
You might like
PHP 配置文件中open_basedir选项作用
2009/07/19 PHP
基于php 随机数的深入理解
2013/06/05 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
checkbox使用示例
2013/08/23 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
简单了解前端渐进式框架VUE
2020/07/20 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
python迭代器与生成器详解
2016/03/10 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
Python中str.join()简单用法示例
2018/03/20 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
python学生信息管理系统(初级版)
2018/10/17 Python
python tkinter组件使用详解
2019/09/16 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
最新奶茶店创业计划书范文
2014/02/08 职场文书
授权委托书范本
2014/04/03 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
技术股份合作协议书
2014/10/05 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书
Python实现为PDF去除水印的示例代码
2022/04/03 Python
Pillow图像处理库安装及使用
2022/04/12 Python
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python