vue加载视频流,实现直播功能的过程

目录
  • 前言
  • 一、视频流是什么?
  • 二、vue加载rtmp视频流
    • 1.方法一:video.js
    • 2.方法二:ckplayer
  • 三、vue加载hls视频流
    • 1.index.html中
    • 2.video-player.vue文件

前言

最近在项目中有一个播放监控站点图像视频的功能(类似与直播),然后对此进行了一个记录与总结!

在此功能中,后台本来给的是rtmp格式的视频流,后在网上找了几种方式,发现rtmp视频流需要使用flash播放器,然而各大主流浏览器已经放弃flash,因此最后又改用hls格式的视频流,最终完成这个功能!(如果只是想要成功的代码,请直接看:三、vue加载hls视频流)

一、视频流是什么?

  • 视频流:视频流其实就是流媒体(streaming media),是指将一连串数据压缩后,经过网络分段发送,即时传输以供观看音视频的一种技术。监控、直播等实时播放的功能一般都使用的是流媒体。
  • 流媒体协议:流媒体协议是一种标准化的传递方法,用于将视频分解为多个块,将其发送给视频播放器,播放器重新组合播放,常见的有rtmp、hls、hds、mss、MPEG-DASH等。
  • 视频格式(format):视频格式指视频文件格式(container format)。常见 container format 包括 .mp4、.m4v、.avi、.mov等。

三种定义在这里不做过多赘述,有想深入了解的小伙伴可以自己再去了解一下;rtmp视频流实际上就是以rtmp流媒体协议生成的流媒体;hls视频流同理(这个视频流的格式一般由后台进行控制)

二、vue加载rtmp视频流

1.方法一:video.js

npm install --save vue-video-player
npm install --save videojs-flash
<template>
    <div class="box">
        <section id="video" class="video-js vjs-default-skin" ref="viodeRef"></section>
    </div>
</template>
<script>
    import Video from 'video.js'
    import 'video.js/dist/video-js.min.css'
  export default {
    name: 'video-play-box',
    mounted(){
      this.player = Video('video', {
        //确定播放器是否具有用户可以与之交互的控件。没有控件,启动视频播放的唯一方法是使用autoplay属性或通过Player API。
        controls: true,
        //自动播放属性,muted:静音播放
        muted: false,
        autoplay: true,
        //建议浏览器是否应在<video>加载元素后立即开始下载视频数据。
        preload: "auto",
        //设置视频播放器的显示宽度(以像素为单位)
        width: "800px",
        //设置视频播放器的显示高度(以像素为单位)
        height: "500px",
        // poster: 'https://static.shuxuejia.com/img/video_image.png', // 封面图片
        sources: [{
          src:"rtmp://58.200.131.2:1935/livetv/cctv3",
          type:'video/rtmp'
        }],
            
        playbackRates: [0.5, 1, 1.5, 2] //倍速播放
      }, function onPlayerReady() {
        Video.log('Your player is ready!'); // 比如: 播放量+1请求
        this.on('ended', function() {
          Video.log('Awww...over so soon?!');
        });
      });
      // this.myPlayer.src('rtmp://10.15.3.31:1935/live/openUrl/QUDplmM')
      // this.myPlayer.load('rtmp://10.15.3.31:1935/live/openUrl/QUDplmM')
        },
    beforeDestroy() {
      if (this.player) {
        this.player.dispose()
      }
    },
        
  }
</script>
<style scoped lang="scss">
.box{
    width:100%;
    height:100%;
    display:flex;
    align-items: center;
    justify-content: center;
    .video{
        margin:0 auto;
    }
}
</style>

2.方法二:ckplayer

因为本人已经尝试过由于flash原因不可用,所以已经都删掉了,没有部分截图,就文字描述一下,感兴趣的小伙伴可以自己搜一下。

  • 第一步:官网下载ckplayer
  • 第二步:将下载好的文件夹解压后放到项目中的static(静态资源文件夹)下
  • 第三步:在index.html中对应引入ckplayer.js文件
  • 第四步:创建播放视频的vue文件,代码如下:
<template>
  <div>
    <label>ckplayer播放器插件Vue使用Demo</label>
    <div id="video"></div>
  </div>
</template>
<script>
export default {
  name: 'ckplayerPlugin',
  data () {
    return {
    }
  },
  mounted: function(){
    // 挂载完成后进行
    var videoObject = {
                container: '#video', //容器的ID或className
                variable: 'player', //播放函数名称
                loaded: 'loadedHandler', //当播放器加载后执行的函数
                loop: true, //播放结束是否循环播放
                cktrack: 'static/ckplayer/material/srt.srt', //字幕文件
                poster: 'static/ckplayer/material/poster.jpg', //封面图片
                preview: { //预览图片
                    file: ['static/ckplayer/material/mydream_en1800_1010_01.png', 'static/ckplayer/material/mydream_en1800_1010_02.png'],
                    scale: 2
                },
                config: '', //指定配置函数
                debug: true, //是否开启调试模式
                drag: 'start', //拖动的属性
                seek: 0, //默认跳转的时间
                //广告部分开始
                adfront: 'http://×××w.ckplayer.com/yytf/swf/front001.swf,http://×××w.ckplayer.com/yytf/swf/front002.swf', //前置广告
                adfronttime: '15,15',
                adfrontlink: '',
                adpause: 'http://×××w.ckplayer.com/yytf/swf/pause001.swf,http://×××w.ckplayer.com/yytf/swf/pause002.swf',
                adpausetime: '5,5',
                adpauselink: '',
                adinsert: 'http://×××w.ckplayer.com/yytf/swf/insert001.swf,http://×××w.ckplayer.com/yytf/swf/insert002.swf',
                adinserttime: '10,10',
                adinsertlink: '',
                inserttime: '10,80',
                adend: 'http://×××w.ckplayer.com/yytf/swf/end001.swf,http://×××w.ckplayer.com/yytf/swf/end002.swf',
                adendtime: '15,15',
                adendlink: '',
                //广告部分结束
                promptSpot: [ //提示点
                    {
                        words: '提示点文字01',
                        time: 30
                    },
                    {
                        words: '提示点文字02',
                        time: 150
                    }
                ],
                video: [
                    ['http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4', 'video/mp4', '中文标清', 0],
                    ['http://img.ksbbs.com/asset/Mon_1703/d0897b4e9ddd9a5.mp4', 'video/mp4', '中文高清', 0],
                    ['http://img.ksbbs.com/asset/Mon_1703/eb048d7839442d0.mp4', 'video/mp4', '英文高清', 10],
                    ['http://img.ksbbs.com/asset/Mon_1703/d30e02a5626c066.mp4', 'video/mp4', '英文超清', 0]
                ]
            };
      // 定义一个对象
      var player = new ckplayer(videoObject);
  }
}
</script>
<style scoped>
  #video {
    width: 600px;
    height: 400px;
    margin: 0px auto;
  }
</style>

总结:经检验,以上两种方法加载均需要flash的支持,然而目前大众浏览器均已放弃flash,所以建议使用下方hls视频流播放;

三、vue加载hls视频流

1.index.html中

添加:

<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>

2.video-player.vue文件

<template>
  <div class="hls">
    <video id="video" muted></video>
  </div>
</template>
<script>
export default {
  name: 'hls-video',
  components: {
  },
  data() {
    return{
        video:null,
        hls:null
    }
  },
  props: {
    selectStdInfo:{
      type:Object,
      required:true
    }
  },
  watch:{
    // 视频弹窗时如果弹窗已存在,重新加载视频流
    "selectStdInfo.mourl":function(oldV,newV){
      if(newV!=oldV){
        this.initVideo()
      }
    }
  },
  mounted() {
    this.initVideo()
  },
  destroyed(){
    this.reset()
  },
  methods: {
        //组件销毁时,调用该方法,停止请求;detachMedia和stopLoad为hls官网方法
      reset(){
          this.hls.detachMedia(this.video)
          this.hls.stopLoad()   
      },
      //初始化video  
      initVideo () {       
          this.video = document.getElementById('video')
          // 浏览器是否支持hls 
          if(Hls.isSupported()) {
             //如果hls已存在,先清空
             if(this.hls){
                this.reset()
              }else{
                this.hls = new Hls()
              }
              //this.selectStdInfo.mourl为父组件传给该子组件的视频url
              this.hls.loadSource(this.selectStdInfo.mourl)
              this.hls.attachMedia(this.video)
              this.hls.on(Hls.Events.MANIFEST_PARSED,()=>{
                this.video.play()
              });
          }else if (video.canPlayType('http://kbs-dokdo.gscdn.com/dokdo_300/_definst_/dokdo_300.stream/playlist.m3u8')) {
            // 不支持hls ,支持苹果原生 
              this.video.src = ''
               this.video.addEventListener('loadedmetadata',function() {
                this.video.play()
           })
         }
      }
  },
}
</script>
<style scoped lang="scss">
.hls{
    width:100%;
    height:100%;
    display:flex;
    align-items: center;
    justify-content: center;
    #video{
    width:100%;
        margin:0 auto;
    }
}
</style>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 2分钟实现一个Vue实时直播系统的示例代码

    前言 我们在不敲代码的时候可能会去看游戏直播,那么是前台怎么实现的呢?下面我们来讲一下. 第一步,购买云直播服务 首先,你必须去阿里云或者腾讯云注册一个直播服务.也花不了几个钱,练手的话,几十块钱就够了. 这里我拿阿里云举例,购买完了,配置好推流域名跟播流域名,下面我们将进行地址生成.记住下面生成的地址,下面会用到. 第二步,下载本地推流工具 https://obsproject.com/ 第三步,设置OBS 在第一步中图片底部有推流地址,需要注意,分为两部分填入下方图所示. 在AppName字

  • 详解Vue实现直播功能

    最近公司刚好在做直播,那么今天就记录一下遇到的坑,公司服务器用的亚马逊aws,所以直接看官方的api就可以了,aws官方地址aws直播api 先看下具体的实现后的效果图把 按照网上成熟的方法,使用的是video.js,然后aws做了一层封装,那么我们直接拿来使用把,这里使用vue版本的vue-video-player 先安装下相关的包 npm install vue-video-player --save 在main.js引入vue-video-player // 第一个是videoJs的样式,

  • vue+webrtc(腾讯云) 实现直播功能的实践

    目录 1.直播效果 2.开直播步骤 2.1引入腾讯web端(快直播)脚本 2.2在需要使用直播的界面 添加一个视频容器(开启直播后,显示视频的位置) 2.3创建直播对象,开启直播 2.4关闭直播 1.直播效果 1.pc端 2.移动端 2.开直播步骤 2.1引入腾讯web端(快直播)脚本 脚本必须引入在 index.heml的body中 <body style="padding:0;margin:0"> //腾讯快直播脚本 <script src="https

  • 使用vue-video-player实现直播的方式

    目录 一.安装vue-video-player 二.使用 vue-video-player 课前准备:直播流协议https://www.cnblogs.com/yangchin9/p/14930874.html 摘要:在H5页面实现观看直播+视频回放:在开发期间使用过video.js.mui-player等插件,发现这些video插件对移动端的兼容性都不友好,最后发现一个在移动端兼容不错的插件——vue-video-player 场景: 移动端H5页面,项目是vue搭建的,使用的是HLS协议以m

  • vue-video-player实现实时视频播放方式(监控设备-rtmp流)

    监控设备播放效果如下 1.vue项目安装vue-video-player npm install vue-video-player --save 2.编写视频播放组件(放上完整的组件例子,父组件调用时给videoSrc和playerOptions.sources[0].src赋值就可以播放了,具体操作有注释) 注:style样式部分用了lang=scss,如果自己的项目没用他请用自己的方式改一下样式部分避免报错 <template> <div class="video-js&q

  • vue加载视频流,实现直播功能的过程

    目录 前言 一.视频流是什么? 二.vue加载rtmp视频流 1.方法一:video.js 2.方法二:ckplayer 三.vue加载hls视频流 1.index.html中 2.video-player.vue文件 前言 最近在项目中有一个播放监控站点图像视频的功能(类似与直播),然后对此进行了一个记录与总结! 在此功能中,后台本来给的是rtmp格式的视频流,后在网上找了几种方式,发现rtmp视频流需要使用flash播放器,然而各大主流浏览器已经放弃flash,因此最后又改用hls格式的视频

  • vue实现的上拉加载更多数据/分页功能示例

    本文实例讲述了vue实现的上拉加载更多数据/分页功能.分享给大家供大家参考,具体如下: 加载状态 <div v-if='has_log == 0'> <load-more tip="上拉加载" :show-loading="false" background-color="#fbf9fe"></load-more> </div> <div v-if='has_log == 1'> <

  • vue 使用mescroll.js框架实现下拉加载和上拉刷新功能

    以下是代码是在项目中抽取出来的,都是实现下拉刷新上拉加载的要点. 注:以下不是用vue-cli写的,用vue-cli的请绕过,抱歉~ 1.mescroll 的页面的初始化 initMescroll(){ var _this = this; this.mescroll = new MeScroll("mescroll",{ down:{ callback: _this.downCallback //下拉刷新的回调函数 }, up:{ callback: _this.upCallback,

  • Vue uni-app框架实现上拉加载下拉刷新功能

    目录 实现上拉加载更多 优化 实现下拉刷新 实现上拉加载更多 打开项目根目录中的pages.json配置文件,为subPackages分包中的商品goods_list页面配置上拉触底的距离: "subPackages": [ { "root": "subpkg", "pages": [ { "path": "goods_detail/goods_detail", "style&

  • Vue vant-ui框架实现上拉加载下拉刷新功能

    目录 知识点速记 基本用法 下拉刷新 代码实现 1.页面布局 2.样式 3.方法 下拉刷新效果: 知识点速记 基本用法 List通过loading和finished两个变量控制加载状态,当组件滚动到底部时,会触发load事件并将loading设置成true.此时可以发起异步操作并更新数据,数据更新完毕后,将loading设置成false即可.若数据已全部加载完毕,则直接将finished设置成true即可. 下拉刷新 List 组件可以与PullRefresh组件结合使用,实现下拉刷新的效果.

  • Vue加载组件、动态加载组件的几种方式

    什么是组件: 组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展. 下面一段简单的代码给大家介绍Vue加载组件的几种方式,具体代码如下所示: //正常加载 import index from '../pages/index.vue' import view from '../pages/view.vue' //懒加载 const i

  • Android自定义listview布局实现上拉加载下拉刷新功能

    listview实现上拉加载以及下拉刷新的方式有很多.下面是我写的一种自定义的布局,复用性也比较的强.首先就是继承的listview的自定义view.   AutoListView.Java: package com.example.mic.testdemo.view; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.os.Bu

  • Android实现网络加载时的对话框功能

    效果预览 简要说明 现在android程序网络请求操作是必不可少的,然而拥有好的交互体验的程序对网络耗时操作的处理尤为重要. 代码说明: dialog_loading.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="

  • vue加载自定义的js文件方法

    在做项目中需要自定义弹出框.就自己写了一个. 效果图 遇见的问题 怎么加载自定义的js文件 vue-插件这必须要看.然后就是自己写了. export default{ install(Vue){ var tpl; // 弹出框 Vue.prototype.showAlter = (title,msg) =>{ var alterTpl = Vue.extend({ // 1.创建构造器,定义好提示信息的模板 template: '<div id="bg">' + '&

  • js+HTML5 canvas 实现简单的加载条(进度条)功能示例

    本文实例讲述了js+HTML5 canvas 实现简单的加载条(进度条)功能.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>www.jb51.net canvas实现加载条动画</title> </head> <body> <canv

随机推荐