vue2.0使用vue-video-player实现直播

一、视频直播的协议

视频直播服务支持输出RTMP、FLV、HLS、ARTC四种协议

  • RTMP(Real Time Messaging Protocol,实时消息传送协议)
    是Adobe公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。RTMP协议比较全能,既可以用来推送,又可以用来直播。其核心理念是将大块的视频帧和音频帧“剁碎”,然后以小数据包的形式在互联网上进行传输,且支持加密,因此隐私性相对比较理想,但拆包组包的过程比较复杂,所以在海量并发时容易出现一些不可预期的稳定性问题。
  • HLS
    HLS是苹果推出的解决方案。
    将视频分成5秒10秒的视频小分片,然后用m3u8索引表进行管理。由于客户端下载到的视频都是5秒10秒的完整数据,故视频的流畅性很好,但也同样引入了很大的延迟(HLS的一般延迟在10秒~30秒左右)。相比于FLV、HLS在iPhone和大部分Android手机浏览器上的支持非常足,所以常用于QQ和微信朋友圈的URL分享。在safari上可以直接打开m3u8格式的文件。
  • FLV
    HTTP-FLV协议由Adobe公司主推。
    格式极其简单,只是在大块的视频帧和音视频头部加入一些标记头信息,由于这种极致的简洁,在延迟表现和大规模并发方面都很成熟。唯一的不足就是在手机浏览器上的支持非常有限,但是用作手机端App直播协议却异常合适。
  • ARTC是阿里云提供的低延迟直播RTS(Real-time Streaming)解决方案使用的协议头。
    该方案参考WebRTC交互方式,采用UDP传输协议打造,实现可以承载大规模并发,端到端延时1秒内的低延时直播体验,同时对交互流程做了秒开优化,以及兼容更多的直播音视频特性例如AAC解码、B帧。RTS服务部署于阿里云直播节点,在接入成本、节点覆盖、承载能力上实现了平衡,大幅优化直播体验。

RTMP、HLS、HTTP-FLV、ARTC协议对比

在这里插入图片描述

二、推流+拉流是什么?

  • 推流:把本地的视频直播推到服务器上,用OBS可以推流
  • 拉流:已有直播内容,从指定的地址拉取

三、 浏览器播放器选择,为什么选择vue-video-player

  • video.js:包比较大,实现hls直播的时候其实是内嵌了hls.js的代码,由于封装好UI和功能,使其不够灵活,修改UI时需要通过插件实现。
  • vue-video-player:将video.js集成到了Vue中,考虑vue项目,技术融合比较好
  • clappr:就是个垃圾,反正我不会,不妨碍我骂他垃圾。气死。
  • 阿里云播放器
  • 大牛播放器
  • flv.js:bilibili开源

四、实现代码

1. 下载依赖

cnpm i vue-video-player -S
cnpm i videojs-flash -S  //这个一定要下载

1. 引入

  • 全局引入
import VideoPlayer from 'vue-video-player'
require('video.js/dist/video-js.css')
require('vue-video-player/src/custom-theme.css')
Vue.use(VideoPlayer)
//引入 hls,视频直播(m3u8)必须引入的
import 'videojs-contrib-hls'
//播放rtmp视频
import 'videojs-flash'

这个我没有在全局引入,只有这个页面用到播放器

  • 局部引入
import { videoPlayer } from 'vue-video-player'
  import 'video.js/dist/video-js.css'
  import 'vue-video-player/src/custom-theme.css'
  // import 'videojs-contrib-hls/dist/videojs-contrib-hls' 
  //引入 hls,视频直播(m3u8)必须引入的
  import 'videojs-contrib-hls'
  //播放rtmp视频
  import 'videojs-flash'

  export default {
    name: 'live',
    components: {
      videoPlayer
    },

main.js中

//引入 hls,视频直播(m3u8)必须引入的
import 'videojs-contrib-hls'
//播放rtmp视频
import 'videojs-flash'

3. 基本功能可行。

<template>
  <div class="liveView">
    <video-player
      class="vjs-custom-skin"
      ref="videoPlayer"
      :options="playerOptions"
      @ready="onPlayerReadied"
      @timeupdate="onTimeupdate"
    >
    </video-player>

    <div class="inputWrapper">
      <div class="form-group row">
        <label for="" class="col-sm-4 col-form-label">HLS: </label>
        <div class="col-sm-8">
          <input class="form-control" type="text" placeholder="HLS url here" v-model="streams.hls" />
        </div>
      </div>
    </div>
    <div class="buttonWrapper">
      <button class="btn btn-primary" type="button" @click="enterStream">Apply</button>
    </div>
  </div>
</template>

<script>
  import { videoPlayer } from 'vue-video-player'
  import 'video.js/dist/video-js.css'
  import 'vue-video-player/src/custom-theme.css'
  // import 'videojs-contrib-hls/dist/videojs-contrib-hls' 
  //引入 hls,视频直播(m3u8)必须引入的
  import 'videojs-contrib-hls'
  //播放rtmp视频
  import 'videojs-flash'

  export default {
    name: 'live',
    components: {
      videoPlayer
    },
    data() {
      return {
        initialized: false,
        currentTech: '',
        streams: {
          rtmp: '',
          hls: ''
        },
        playerOptions: {
          overNative: true,
          autoplay: false,
          controls: true,
          techOrder: ['html5'],
          sourceOrder: true,
          flash: {
            hls: { withCredentials: false }
          },
          html5: { hls: { withCredentials: false } },
          sources: [
            {
              withCredentials: false,
              type: 'application/x-mpegURL',
              src: 'http://ivi.bupt.edu.cn/hls/btv1hd.m3u8'
            }
          ],
           controlBar: {
             timeDivider: false, // 时间分割线
             durationDisplay: false, // 总时间
             progressControl: true, // 进度条
             customControlSpacer: true, // 未知
             fullscreenToggle: true // 全屏
           },
        }
      }
    },
    computed: {
      player() {
        return this.$refs.videoPlayer.player
      },
      currentStream() {
        return this.currentTech === 'Flash' ? 'RTMP' : 'HLS'
      }
    },
    methods: {
      onPlayerReadied() {
        if (!this.initialized) {
          this.initialized = true
          this.currentTech = this.player.techName_
        }
      },
      // record current time
      onTimeupdate(e) {
        console.log('currentTime', e.cache_.currentTime)
      },
      enterStream() {
        this.playerOptions.sources[0].src = this.streams.hls
        this.playerOptions.autoplay = true
      },
      changeTech() {
        if (this.currentTech === 'Html5') {
          this.playerOptions.techOrder = ['html5']
        } else if (this.currentTech === 'Flash') {
          this.playerOptions.techOrder = ['flash']
        }
        this.playerOptions.autoplay = true
      }
    }
  }
</script>

<style scoped>
  .liveView {
    position: relative;
  }

  .selectWrapper {
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 20px;
    line-height: 30px;
    margin: 20px;
    vertical-align: baseline;
  }

  .inputWrapper {
    width: 500px;
    margin: 0 auto;
  }

  .buttonWrapper {
    text-align: center;
  }
</style>

五、 m3u8格式直播地址可测试

北京卫视高清

http://ivi.bupt.edu.cn/hls/btv1hd.m3u8

北京体育高清

http://ivi.bupt.edu.cn/hls/btv2hd.m3u8

北京纪实高清

http://ivi.bupt.edu.cn/hls/btv11hd.m3u8

资料参考:
https://blog.csdn.net/Jioho_chen/article/details/104806803
https://www.cnblogs.com/dreamsqin/p/12557070.html

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Vue是一种流行的前端框架,它提供了强大的工具和组件,可以帮助我们构建现代化的Web应用程序。在Vue中播放RTMP流而不使用Flash,我们可以使用一些现代的技术和组件。 首先,我们可以使用video.js这样的HTML5播放器库来播放RTMP流。video.js是一个功能强大且易于使用的库,它支持HTML5视频播放,并且可以扩展以支持不同的流媒体协议,包括RTMP。我们可以使用video.js的vue插件vue-video-player来在Vue应用中轻松地集成该播放器。 其次,我们可以使用hls.js库来播放RTMP流。hls.js是一个JavaScript库,它使用HTTP Live Streaming(HLS)协议来播放视频流。我们可以使用vue-hls-player这样的vue插件来在Vue使用hls.js库。这个插件提供了一个简单的组件,可以方便地集成HLS播放器,并播放RTMP流。 最后,我们还可以使用DPlayer这样的开源视频播放器库来播放RTMP流。DPlayer是基于HTML5的视频播放器,它使用了开源的flv.js库来支持FLV格式的视频流。我们可以使用vue-dplayer这样的vue插件来在Vue应用中使用DPlayer来播放RTMP流。 总之,我们可以使用video.js、hls.js或DPlayer这些HTML5播放器库来在Vue应用中播放RTMP流而不使用Flash。这些库都提供了vue插件,可以轻松地与Vue应用集成。 ### 回答2: vue播放rtmp使用flash可以采用video.js配合Hls.js插件实现。 首先在vue项目中安装video.js和hls.js插件: ```bash npm install video.js hls.js ``` 然后在组件中引入video.js的css和js文件,并创建一个video标签: ```html <template> <div> <video id="my-video" class="video-js"></video> </div> </template> <script> import videojs from 'video.js'; import 'video.js/dist/video-js.css'; import Hls from 'hls.js'; export default { mounted() { this.initPlayer(); }, methods: { initPlayer() { const options = { autoplay: true, controls: true, sources: [{ src: 'rtmp://your-rtmp-stream-url.com/live/stream-name', type: 'rtmp/mp4', }], }; const player = videojs('my-video', options); if (Hls.isSupported()) { const hls = new Hls(); hls.loadSource('http://your-hls-stream-url.com/live/stream-name.m3u8'); hls.attachMedia(player); hls.on(Hls.Events.MANIFEST_PARSED, () => { player.play(); }); } else if (player.canPlayType('rtmp/mp4')) { player.src(options.sources[0].src); player.play(); } } } } </script> ``` 以上代码在组件加载时初始化了video.js播放器,并通过options设置播放器的参数,其中source中的src填入你的rtmp流链接。然后通过Hls.js加载hls流,如果浏览器不支持hls,则fallback到rtmp流播放。 最后通过mounte钩子函数调用initPlayer函数,实现播放rtmp流不使用flash的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值