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 相关文章推荐
js对图片base64编码字符串进行解码并输出图像示例
Mar 17 Javascript
JavaScript日期时间格式化函数分享
May 05 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
javascript闭包(Closure)用法实例简析
Nov 30 Javascript
JS实现最简单的冒泡排序算法
Feb 15 Javascript
Node.js利用断言模块assert进行单元测试的方法
Sep 28 Javascript
vue微信分享 vue实现当前页面分享其他页面
Dec 02 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
Dec 29 jQuery
JavaScript基于SVG的图片切换效果实例代码
Dec 15 Javascript
js制作提示框插件
Dec 24 Javascript
vue中配置scss全局变量的步骤
Dec 28 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 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验证码代码
2012/02/27 PHP
php绘制一个扇形的方法
2015/01/24 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
使用Apache的rewrite
2021/03/09 Servers
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
2016/12/29 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
python中dir函数用法分析
2015/04/17 Python
RC4文件加密的python实现方法
2015/06/30 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
法学专业本科生自荐信范文
2013/12/17 职场文书
小学安全工作总结2015
2015/05/18 职场文书