前端嵌入视频直播和聊天支持.m3u8格式

摘要:
Playinline=“true”:循环:源:[{type:true//全屏按钮}}5。为此重新分配视频地址。playerOptions['ssources'][0]['src']='接口地址'完成上述配置后,可以播放视频。您需要在步骤4中的playerOptions中配置类型和src,这不支持中的视频。m3u8格式。

1、安装vue-video-player

npm install vue-video-player --save

2、在main.js中引入vue-video-player

import VideoPlayer from 'vue-video-player'
require('video.js/dist/video-js.css')
require('vue-video-player/src/custom-theme.css')
Vue.use(VideoPlayer)

  

3、在页面中使用插件

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

4、在data中配置数据

  playerOptions : {
    playbackRates: [0.7, 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: "application/x-mpegURL",//这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目
      src: "http://hls01open.ys7.com/openlive/6d499d610a0c4a6182e36ac7dca124ad.m3u8" //url地址
    }],
    poster: "../../static/images/test.jpg", //你的封面地址
    //  document.documentElement.clientWidth, //播放器宽度
    notSupportedMessage: '此视频暂无法播放,请稍后再试', //允许覆盖Video.js无法播放媒体源时显示的默认信息。
    controlBar: {
      timeDivider: true,
      durationDisplay: true,
      remainingTimeDisplay: false,
      fullscreenToggle: true  //全屏按钮
    }
}

  

5、重新赋值视频地址

this.playerOptions['sources'][0]['src'] = '接口地址'

完成以上配置就可以播放视频了
需要在第四步的 playerOptions中配置一下
type和src 其中不支持.m3u8格式的视频,如果需要播放.m3u8格式的需要继续下载插件

五、兼容.m3u8格式的视频操作

1、需要下载videojs-contrib-hls

npm install --save videojs-contrib-hls

2、在页面或者组件中引入

import 'videojs-contrib-hls'

3、在页面中测试

{
 type: 'application/x-mpegURL', // 这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目
 //src:
  'https://cdn.letv-cdn.com/2018/12/05/JOCeEEUuoteFrjCg/playlist.m3u8' // url地址,从别的博主那看来的地址,亲测可用
src: "https://assets.ygunoil.com/style/video/yys-app-intro-v4.mp4?avvod/m3u8"
}

 

六、聊天室用到sockjs

  npm i sockjs

  npm i stompjs

// 
import 'video.jsdistvideo-js.css'
import {videoPlayer} from 'vue-video-player'
//  import 'videojs-flash'


//  ios
import 'videojs-contrib-hls' // 避免flash兼容问题,所以都使用pc和h5都使用hls播放

//  SockJS
// import SockJS from  'sockjs-client';
//  import Stomp from 'stompjs';
import  {Stomp} from '@/assets/js/stomp.js'; // 因为我使用的是后台给我的Js文件,所以直接引入的

//  直播配置(还有很多配置,百度可以搜到)
      playerOptions: {
         height: '529',
          '940',
        sources: [
          //  {
          //     // src: rtmp58.200.131.21935livetvhunantv, // 湖南台的直流地址
          //    type: 'rtmpmp4',
          //  },
          //  {
          //    type: 'applicationx-mpegURL',
          //    src: 'httpivi.bupt.edu.cnhlscctv1hd.m3u8',
          //  }
        ], // 表示组件会按顺序自动识别,如果第一个不能播放,则使用下一个(流配置,数组形式,会根据兼容顺序自动切换)
        notSupportedMessage: '请刷新页面', // 允许覆盖Video.js无法播放媒体源时显示的默认信息。//有些提示不生效,直接去node_modules里去改源文件
        autoplay: false, // 是否自动播放
        controls: true, // 控制条
        // poster , 你的封面地址
        controlBar: {
          timeDivider: false, // 当前时间和持续时间的分隔符
          durationDisplay: false,// 显示持续时间
          remainingTimeDisplay: false, // 是否显示剩余时间功能
          fullscreenToggle: true // 全屏按钮
        }
      },

  

//1.解决移动端自动全屏的问题(微信)
  computed: {
    playsinline(){
      var ua = navigator.userAgent.toLocaleLowerCase();
      console.log(ua)
       //x5内核
      if (ua.match(/tencenttraveler/) != null || ua.match(/qqbrowse/) != null) {
        return false
      }else{
        //ios端
        return true       
      }
    },

//  在vue-video-player的onPlayerCanplay(视频可播放)这个方法中添加回调

 onPlayerCanplay(player) {
        // console.log('player Canplay!', player)
        //解决自动全屏
        var ua = navigator.userAgent.toLocaleLowerCase();
        //x5内核
      if (ua.match(/tencenttraveler/) != null || ua.match(/qqbrowse/) != null) {
        
          $('body').find('video').attr('x-webkit-airplay',true).attr('x5-playsinline',true).attr('webkit-playsinline',true).attr('playsinline',true)
      }else{
        //ios端
          $('body').find('video').attr('webkit-playsinline',"true").attr('playsinline',"true") 
      }
    }
  },

  

//  sockjs(在mounted中调用this.initWebSocket())
    initWebSocket() {
      this.connection();
      let self = this;
      //  断开重连机制,尝试发送消息,捕获异常发生时重连
      this.timer = setTimeout(() => {
        try {
          self.stompClient.send(test);
        } catch (err) {
          // console.log(断线了  + err);
          self.connection();
        }
      }, 5000);
    },
    removeTab(targetName) {
      console.log(targetName)
    },
    connection() {
      console.log(this.detailsObj)
      //  建立连接对象(${l_url}liveLesson后台给的地址)
      this.socket = new SockJS(`${l_url}liveLesson`);//连接服务端提供的通信接口,连接以后才可以订阅广播消息和个人消息
      console.log(this.socket)
      //  获取STOMP子协议的客户端对象
      this.stompClient = Stomp.over(this.socket);
      console.log(this.stompClient)
      //  延迟重连时间
      this.stompClient.reconnect_delay = 3000
      //  定义客户端的认证信息,按需求配置
      var headers = {
        userId: this.$store.state.user_info.userId,
        liveStreamId: this.detailsObj.liveStreamId
      };
      let fid = this.detailsObj.liveStreamId
      console.log(this.$store.state.user_info.userId,fid)
      //  向服务器发起websocket连接
      this.stompClient.connect(headers,(frame) => {
        console.log('连接成功',frame)
      }, (err) => {// 连接发生错误时的处理函数
              console.log(2222,err);
          }
    )
    }

    //  断开连接
    disconnect() {
       if (this.stompClient != null) {
         this.stompClient.disconnect();
         console.log(Disconnected);
       }
      if (this.socket != null) {
        this.socket.close();
        this.socket = null;
      }
    }

 注意:

  1. 如果需要播放 RTMP 流,需要安装 videojs-flash 插件
  2. 如果两个流都需要播放,flash 插件需要安装到 hls 插件之前

  npm install--save videojs-flash // 启用flash进行播放,有兼容问题(火狐),所以我们项目中只使用了hls进行播放

  npm i videojs-contrib-hls // 解决ios播放问题

免责声明:文章转载自《前端嵌入视频直播和聊天支持.m3u8格式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇给ubuntu换内核IdentitiServser4 + Mysql实现Authorization Server下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

营销号视频生成器(Python)

网上最近很火的段子是各种营销号的文案,比方说下面的段子 核桃核不能吞下去是怎么回事呢?核桃核相信大家都很熟悉,但是核桃核不能吞下去是怎么回事呢,下面就让小编带大家一起了解吧。核桃核不能吞下去,其实就是核桃核太大了,吞下去容易噎着,大家可能会很惊讶核桃核怎么会不能吞下去呢?但事实就是这样,小编也感到非常惊讶。这就是关于核桃核不能吞下去的事情了,大家有什么想法...

Laravel 5.2 三、中间件、视图与 Blade 模板引擎

一、中间件 Laravel 的 HTTP 中间件提供了对路由的一层过滤和保护。下面模拟一下用中间件验证后台登录。 1. 创建中间件 cmd 窗口进入项目目录,使用 artisan 命令创建 php artisan make:middleware AdminLoginVerify 这将在 app/Http/Middleware 目录创建中间件 AdminLo...

关于pocsuite的使用

0x00 前言 pocsuite的用处就不多说了,早些时候也看到黑哥和余弦大佬在微博上说zoomeye 和pocsuite升级了。 结合最近自己在审计cms,也想收集一下其他cms的poc,比如chybeta大佬的cmsPoc,还有Lucifer1993大佬的AngelSword,用pcosuite重新写一下poc,同时自己审出来的一些"0day"也是可以...

mysql如何存储过程返回记录的更新条数

#ROW_COUNT()返回被前面语句升级的、插入的或删除的行数。 #这个行数和 mysql 客户端显示的行数及 mysql_affected_rows() C API 函数返回的值相同。 use test; create table t(id int,NAME varchar(200),addr varchar(200)); INSERT INTO t...

用node-http-proxy搭建代理

程序员三大必备网站是:Google、Github、StackOverflow。如果你还在用Baidu搜索技术文章的话,我想说的是,少年你已经被鄙视很多年了,赶紧换成谷歌吧,不要再被鄙视了!Github、StackOverflow在国内能够正常访问,但是Google由于众所周知的原因,国内无法访问,所以我们需要FQ访问Google。个人觉得shadowsoc...

WebView JS与RN进行通讯

RN0.37终于官方增加了WebView与React Native的通讯,之前一真使用的是第三方控件React-Native-WebView-Bridge,但不是知道怎么回事这个第三方控件喊了很长时间最终却是另一作者提交了该功能的官方版本。言归正转,由于Web的需求丰富多样所以如果不能实现WebView里的JS与RN的通讯的话,就显得特别不方便,下面代码示...