首页 > 其他分享 >web前端(Vue2.x)接收H264实时视频码流(二进制)进行播放

web前端(Vue2.x)接收H264实时视频码流(二进制)进行播放

时间:2023-10-28 21:12:07浏览次数:34  
标签:码流 web player H264 re video msg ws data

1、安装 jmuxer

npm install [email protected]

2、.vue文件中使用

<template>
 <div>
  <video id="dom_id" muted="muted" controls class="video_box"></video>
  <div
   v-if="!has_data"
   v-loading="!has_data && player"
   element-loading-text="加载中"
   element-loading-spinner="el-icon-loading"
   element-loading-background="rgba(0, 0, 0, 1)"
   id="backgroud_color"
  ></div>
 </div>
</template>

<script>
import JMuxer from 'jmuxer'
export default {
 name: 'Video',
 data() {
  return {
   ws: null,
   video: null,
   player: null,
   has_data: false,
  }
 },
 methods: {
  // 初始化 websocket
  initWebSocket() {
   let wsuri = 'ws://127.0.0.1:8080'
   this.ws = new WebSocket(wsuri)
   this.ws.binaryType = 'arraybuffer'
   this.ws.onopen = this.websocketonopen
   this.ws.onmessage = this.websocketonmessage
   this.ws.onerror = this.websocketonerror
   this.ws.onclose = this.websocketclose
  },
  // 连接成功的回调
  websocketonopen() {
   console.log('连接成功')
   setTimeout(() => {
    this.handle_preview('start_preview')
   }, 300)
  },
  // 开始/结束预览
  handle_preview(cmd) {
   let send_data = {
    cmd,
    taskname: "测试",
   }
   this.init_player()
   this.ws.send(JSON.stringify(send_data))
  },
  // 接收到的数据
  websocketonmessage(e) {
   let re_msg = e.data
   if (re_msg instanceof Object) {
    // 二进制时往video中push
    console.log(`二进制`)
    try {
     this.player.feed({
      video: new Uint8Array(re_msg),
     })
    } catch (err) {}
   } else {
    // 判断是否成功
    re_msg = JSON.parse(re_msg)
    console.log('字符串')
    switch (re_msg.cmd) {
     case 'preview_status':
      if (re_msg.code != 200) return this.layer_msg(re_msg.msg)
      break
    }
   }
  },
  // 弹窗提示
  layer_msg(msg) {
   this.$notify({
    type: 'warning',
    showClose: true,
    title: '提示',
    dangerouslyUseHTMLString: true,
    message: msg,
    position: 'top-right',
    duration: 3000,
   })
  },
  // 初始化播放器
  init_player() {
   this.player = new JMuxer({
    node: "video_box",
    mode: 'video',
    flushingTime: 30,
    maxDelay: 16,
    clearBuffer: true,
    debug: false,
    onReady: () => {
     return this.get_paused()
    },
   })
  },
  // 获取是否在播放的状态
  get_paused() {
   this.video = document.getElementById("video_box")
   if (this.video.paused) {
    this.video.click()
    this.video.play()
    this.toggle_bg()
   } else {
    setTimeout(() => {
     return this.get_paused()
    }, 300)
   }
  },
  // 切换黑色背景显隐
  toggle_bg() {
   let timer = setInterval(() => {
    if (this.video.currentTime > 0) {
     clearInterval(timer)
     this.has_data = true
     this.video.currentTime = 0 // 不要去掉,作用重要
    } else {
     this.has_data = false
    }
   }, 1000)
  },
  // websocket 连接中断
  websocketonerror(e) {
   console.log('error', e)
  },
  //   websocket 断开
  websocketclose(e) {
   console.log('断开连接')
  },
  // 手动关闭ws
  close_ws() {
   console.log('关闭', this.ws)
   if (this.ws && this.ws.readyState == 1) {
    // 停止预览
    this.handle_preview('stop_preview')
    this.video.src = null
    this.player.destroy()
    this.player = null
    this.has_data = false
    this.ws.close()
    this.ws = null
   }
  },
 },
 mounted() {},
}
</script>

<style lang="scss" scoped>
.video_box {
 width: 100%;
 height: 480px;
 border-radius: 8px;
}
#backgroud_color {
 position: absolute;
 background: black;
 width: 100%;
 height: 480px;
 right: 0;
 top: 0;
 border-radius: 8px;
}
video::-webkit-media-controls {
 /*禁用播放器控制栏的样式*/
 display: none !important;
}
</style>

 

标签:码流,web,player,H264,re,video,msg,ws,data
From: https://www.cnblogs.com/lyt520/p/17794644.html

相关文章

  • Flutter在web平台使用iframe标签
    主要是针对web平台,在web平台中嵌入iframe标签,将其他网站嵌入在自己的页面当中。第一部分,只在web平台运行1.注册iframe组件platformViewRegistry.registerViewFactory("iframe-webview",(_){......});2.创建自己的iframe组件,并设置参数,宽高和加载的url等platformView......
  • ctf_show Web的Web8题解
    好久没写博客,上次写还是在上次(三年前)。如题,写一次CTF的题解 根据题目提示得知这应该是一个注入,什么注入还不知道,进入靶场。 仅有三个地方可点,都点进去看看。从URL处可以看到前端是传了一个参数id给后端(另外两个类似,就不贴图了)。那很明显了是SQL注入。 首先在参数后......
  • #深度学习复现Github项目代码流程详细过程
    背景要求:已安装好anaconda及pycharm,这两个的安装可从网上学习安装,教程很多。第一步,在Github上下载项目代码因为第一次运行代码,找一些比较多运行成功的例子来练习,这次我找的是Github上的pix2pixGAN项目的源码,具体路径如下:https://github.com/junyanz/pytorch-CycleGAN-and-pix2......
  • netty同时支持tcp和websocket
    最近接手了别人的netty框架实现的im的一个项目,基于tcp实现通信,但是领导要求做一个网页版的聊天,接入到目前的系统,由于第一次接触这种项目,百度一圈大部分都是通过websocket实现通信的方式,最后通过chatgpt发现确实可以同时支持tcp和websocket,现在把方式放上Netty是一个高性能、异步事......
  • rust 创建多线程web server
    创建一个httpserver,处理http请求。创建一个单线程的web服务webserver中主要的两个协议是http和tcp。tcp是底层协议,http是构建在tcp之上的。通过std::net库创建一个tcp连接的监听对象,监听地址为127.0.0.1:8080.usestd::net::TcpListener;fnmain(){l......
  • javaweb--JDBC的API-Connection
    1、获取执行SQL对象2、管理事务setAutoCommit(bool)true为自动提交false为手动提交commit()提交事务rollback()回滚事务packagecom.avb.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;public......
  • javaweb--JDBC的API-DriverManager
    DriverManager可以实现的功能1、注册驱动ClassforName("com.mysql.jdbc.Driver");查看Driver类源码在静态代码块中会运行DriverManager类mysql5以后的驱动包可以省略注册驱动步骤2、获取连接java:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...jdbc:my......
  • javaweb学习每日总结-第八天
    第八天学习Springboot今天也终于是学到了springboot的技术,springboot是一款Java开发的框架,也是当下最流行的开发方式,没有之一!今天我进行了springboot技术的入门,初步了解了springboot技术的发展和应用,也用idea写了一个最简单的springboot程序。除此之外,我还下载了postmen这个软......
  • javaweb--JDBC入门
    packagecom.avb.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;publicclassjdbcdemo{publicstaticvoidmain(String[]args)throwsException{//注册驱动Class.forName("com.mysql.jdbc.D......
  • UI自动化概念 + Web自动化测试框架介绍
    1.UI自动化测试概念:我们先明确什么是UIUI,即(UserInterface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介UI自动化测试:Web自动化测试和移动自动化测试都属于UI自动化测试,UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试2.为什么对UI采用自动化测试?......