直播插件分享——xgplayer,亲测可用!

7,033 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

hello,大家好,最近半个月没有更新文章了(忙着写代码了),这两天在写直播那块的时候,发现网上很多插件比如dplayer、vue-video-player、flv.js、video.js等等,都不能在实际项目中很好的用到,要么是浏览器早已经废除的原因,要么是报错得不到解决,好像大家写出来自己的文章,并不关心到底能不能用,像复制粘贴一样,从官方的或者非官方的地方复制过去,一片片文章大同小异,可能是我太菜了,不会实际运用吧。

今天记录一下我用到的这个插件:

西瓜播放器

image.png

安装

我是在vue中使用的,所以安装是直接npm install xgplayer

组件代码

新建组件videoPlayer.vue,组件代码:

<template>
  <div class>
    <div ref="video" id="mmid"></div>
    <div class="barrage-box">
      <div class="b-text">弹幕</div>
      <div class="input-box">
        <el-input placeholder="请输入内容" v-model="barrageValue">
          <template slot="append">
            |
            <span @click="save()">发送</span>
          </template>
        </el-input>
      </div>
    </div>
  </div>
</template>

<script>
import Player from 'xgplayer';
import FlvPlayer from 'xgplayer-flv'; // flv格式
import HlsJsPlayer from 'xgplayer-hls.js'; // M3U8格式
export default {
  data() {
    return {
      videoPlayer: null,
      barrageValue: ''
    };
  },
  props: {
    cover: '', // 直播封面图
    videoSrc:''
  },
  mounted() {
    this.getVideo();
  },
  methods: {
    getVideo() {
      this.$nextTick(() => {
        console.log(this.videoSrc);
        this.videoPlayer = new FlvPlayer({
          el: document.querySelector('#mmid'),
          url: this.videoSrc,
          width: '100%',
          height: '714px',
          volume: 0.6, // 初始音量
          autoplay: false, // 自动播放
          playsinline: true,
          isLive: true,
          cors: true,
          poster: this.cover, // 封面图
          playbackRate: [0.5, 0.75, 1, 1.5, 2], // 倍速展示
          defaultPlaybackRate: 1,
          danmu: {
            panel: true,
            comments: [
              //弹幕数组
              {
                duration: 15000, //弹幕持续显示时间,毫秒(最低为5000毫秒)
                id: '1', //弹幕id,需唯一
                start: 3000, //弹幕出现时间,毫秒
                prior: true, //该条弹幕优先显示,默认false
                color: true, //该条弹幕为彩色弹幕,默认false
                txt: '', //弹幕文字内容
                mode: 'top' //显示模式,top顶部居中,bottom底部居中,scroll滚动,默认为scroll
              }
            ],
            area: {
              //弹幕显示区域
              start: 0, //区域顶部到播放器顶部所占播放器高度的比例
              end: 1 //区域底部到播放器顶部所占播放器高度的比例
            },
            closeDefaultBtn: false, //开启此项后不使用默认提供的弹幕开关,默认使用西瓜播放器提供的开关
            defaultOff: true //开启此项后弹幕不会初始化,默认初始化弹幕
          }
        });
      });
    },
    // 发送弹幕
    save() {
      if (this.barrageValue) {
        let id = 0;
        this.videoPlayer.danmu.sendComment({
          //发送弹幕
          duration: 15000,
          id: 'chat' + id++,
          txt: this.barrageValue,
          style: {
            color: '#ffffff',
            fontSize: '18px',
            // border: '1px solid #ff9500',
            borderRadius: '50px',
            padding: '5px 12px',
            backgroundColor: 'rgba(255, 255, 255, 0.1)'
          }
        });
      }
    }
  }
};
</script>
<style lang="scss" scoped>
.barrage-box {
  display: flex;
  align-items: center;
  padding: 28px 44px;
  margin-bottom: 26px;
  background-color: #282828;
  .b-text {
    position: relative;
    width: 88px;
    height: 40px;
    padding-left: 32px;
    margin-right: 40px;
    font-size: 18px;
    color: #f1a475;
    line-height: 40px;
    border-radius: 23px;
    border: 1px solid #f1a475;
    &::before {
      position: absolute;
      top: 50%;
      left: 14px;
      transform: translateY(-50%);
      width: 9px;
      height: 9px;
      background: #f1a475;
      border-radius: 50%;
      content: '';
    }
  }
  .input-box {
    width: 48%;
    background: #171616;
    border-radius: 28px;
    span {
      padding-left: 14px;
      &:hover {
        color: #ffffff;
      }
    }
  }
}
/deep/ {
  .el-input__inner {
    border-color: transparent;
    background-color: transparent;
  }
  .el-input-group__append {
    padding-right: 30px;
    border-color: transparent;
    background-color: transparent;
    cursor: pointer;
  }
}
</style>

部分关键字段解释

  • cover:直播封面图,大家可根据需求自行删减;
  • videoSrc:直播链接地址,后端会返回一个推流的地址给前端这边,这时候一定要问清楚这个地址的格式是什么样的,这次我在联调的时候,因为是第一次写直播功能,后端返回的rtmp格式的,导致一直不能播放,后来询问,发现后端那边是可以根据前端想要的格式返回的,正常的有flv格式的和M3U8格式的,在组件中,我们根据不同的格式进行不同的写法:
  • 播放 m3u8 需要安装 npm install --save xgplayer-hls.js,在组件中就要引入import HlsJsPlayer from 'xgplayer-hls.js'; // M3U8格式

image.png

  • 播放flv格式的需要安装 npm install --save xgplayer-flv,在组件中就要引入import FlvPlayer from 'xgplayer-flv'; // flv格式

  • 直播中弹幕的功能我是自己写的输入框去发送弹幕的,可以在官方文档中根据字段配置自己想要的样式

image.png

  • 组件的引用我就不贴代码, 想必应该都会引用组件并传值。

写在最后

还有什么不懂的可以来问我,或者看看官方文档