首页 > 其他分享 >前端在浏览器显示摄像头传回的RTSP视频流,前端采用的技术有VUE+video.js+flv.js

前端在浏览器显示摄像头传回的RTSP视频流,前端采用的技术有VUE+video.js+flv.js

时间:2024-04-23 15:33:38浏览次数:27  
标签:streamUrl WebSocket 前端 视频流 flv player video js

在前端使用Vue.js框架,结合video.js和flv.js播放RTSP视频流,需要经过一系列步骤,因为浏览器并不能直接播放RTSP流,所以通常需要一个服务器来将RTSP流转为HLS或FLV格式,然后前端再通过flv.js播放。以下是一个基于此思路的基本实现指南:

确保你已经安装了Vue.js、video.js、flv.js相关的依赖。

npm install video.js flv.js --save

Vue组件实现

下面是一个简单的Vue组件示例,演示如何集成video.js和flv.js来播放转换后的FLV视频流。

<template>
  <div>
    <video ref="videoPlayer" class="video-js vjs-big-play-centered" controls></video>
  </div>
</template>

<script>
import videojs from "video.js";
import "video.js/dist/video-js.css";
import flvjs from "flv.js";

export default {
  name: "FlvPlayer",
  data() {
    return {
      player: null,
    };
  },
  mounted() {
    this.initPlayer();
  },
  beforeDestroy() {
    if (this.player) {
      this.player.dispose();
    }
  },
  methods: {
    initPlayer() {
      // 假设你已经有了一个HTTP-FLV的地址,该地址是由后端服务提供的,将RTSP流转换为FLV格式
      const streamUrl = "http://your-server-address/stream.flv";
      
      // 初始化video.js播放器
      this.player = videojs(this.$refs.videoPlayer, {}, function() {
        // 当player ready后,初始化flv.js插件
        this.on("ready", () => {
          // 检查flv.js是否支持当前环境
          if (flvjs.isSupported()) {
            const tech = flvjs.getTech('Flvjs');
            this.src({
              type: 'application/x-flv',
              src: streamUrl,
            });
            this.tech_.el_.addEventListener('loadstart', function() {
              flvjs.createPlayer({
                type: 'flv',
                url: streamUrl,
              }).attachMediaElement(this.media()).load();
            });
          } else {
            console.error("flv.js is not supported in this browser.");
          }
        });
      });
    },
  },
};
</script>

<style>
/* 可以在这里添加自定义样式 */
</style>

注意事项

  • 你需要有一个后端服务将RTSP流转换为FLV或HLS流。常用的工具有Node.js的flv.js服务器、ffmpeg等。
  • 代码中的streamUrl应替换为你的实际流媒体地址。
  • flv.js不支持Safari浏览器,对于需要广泛兼容的项目,可能需要考虑其他方案或回退机制。
  • 确保你的服务器配置支持跨域访问,因为前端播放器可能跨域请求视频流。

以上代码提供了一个基础框架,实际应用中可能需要根据具体需求和环境进行调整。

如果streamUrl从后端获取,并隔一段时间推送一次呢?

如果streamUrl需要从后端动态获取,并且这个URL可能会随着时间推移而变化(例如,每隔一段时间后端推送新的流地址),你可以采用Vue的响应式特性以及WebSocket或轮询的方式来动态更新视频流地址。下面是一个简化版的实现思路:

使用WebSocket接收实时更新

  1. 安装WebSocket客户端库: 首先,确保你的项目中安装了WebSocket客户端库,如socket.io-client。 npm install socket.io-client

  2. 建立WebSocket连接: 在Vue组件中建立与后端的WebSocket连接,并设置消息监听器来接收新的streamUrl

import io from "socket.io-client";

data() {
  return {
    player: null,
    streamUrl: '', // 初始化为空或默认值
    socket: null, // 用于存放WebSocket实例
  };
},
mounted() {
  this.initWebSocket();
  this.initPlayer();
},
methods: {
  initWebSocket() {
    this.socket = io("http://your-backend-url"); // 替换为你的后端WebSocket服务器地址
    this.socket.on("newStreamUrl", (newUrl) => {
      console.log("New stream URL received:", newUrl);
      this.streamUrl = newUrl;
      // 当收到新的URL时,重新设置播放器的源
      if (this.player && this.player.src) {
        this.player.src({
          type: 'application/x-flv',
          src: this.streamUrl,
        });
        // 重新加载播放器
        this.player.load();
        // 如果需要,还可以在这里调用play()方法开始播放
      }
    });
  },
  
  // ...其他代码保持不变
},
beforeDestroy() {
  // 清理WebSocket连接
  if (this.socket) {
    this.socket.disconnect();
  }
  // ...其他清理工作
}

使用定时轮询

如果WebSocket不可行,你也可以使用定时轮询的方式从后端获取新的streamUrl。这种方式较为简单,但不够实时,且可能会增加服务器负担。

data() {
  return {
    // ...其他数据属性
    pollInterval: null, // 用于存储轮询定时器
  };
},
mounted() {
  this.pollStreamUrl(); // 启动轮询
},
methods: {
  async pollStreamUrl() {
    try {
      const response = await axios.get("/api/getStreamUrl"); // 假设这是获取新streamUrl的API
      if (response.data && response.data.streamUrl !== this.streamUrl) {
        this.streamUrl = response.data.streamUrl;
        // 更新播放器的源,同WebSocket部分的处理
        if (this.player) {
          this.player.src({
            type: 'application/x-flv',
            src: this.streamUrl,
          });
          this.player.load();
        }
      }
    } catch (error) {
      console.error("Error fetching stream URL:", error);
    }
    // 设置下一次轮询
    this.pollInterval = setTimeout(() => this.pollStreamUrl(), 5000); // 每5秒检查一次
  },
  
  // ...其他代码保持不变
},
beforeDestroy() {
  // 清除轮询定时器
  if (this.pollInterval) {
    clearTimeout(this.pollInterval);
  }
  // ...其他清理工作
}

以上两种方法分别展示了使用WebSocket实时接收新流地址和定时轮询获取流地址的实现思路。根据你的具体需求和后端支持情况选择合适的方案。

 

标签:streamUrl,WebSocket,前端,视频流,flv,player,video,js
From: https://www.cnblogs.com/guwufeiyang/p/18152973

相关文章

  • JS基础(二)运算符、流程控制语句、数组对象、JSON对象、Date对象、Math对象、Function对
    一运算符<script>//算数运算符//(1)自加运算varx=10;//x=x+1;//x+=2;varret=x++;//先赋值再计算:x+=1//varret=++x;//先计算再赋值:x+=1console.log(x)......
  • 模块与包、json模块
    【一】模块与包介绍【1】什么是模块在Python中,一个py文件就是一个模块,文件名为xxx.py,模块名则是xxx,导入模块可以引入模块中已经写好的功能。如果把开发程序比喻成制造一台电脑编写模块就像是在制造电脑的零部件准备好零件后,剩下的工作就是按照逻辑把它们组装到一起。将......
  • js常见问题
    Chrome88后更新了更为激进的省电策略[1],导致后台非活动页面中setInterval、setTimeout回调的执行间隔拉长到1分钟以上。这里有一种很巧妙的方法可以强制标签页不进入非活动状态(利用了播放视频时标签页不会休眠的机制),而且不需要改动业务代码,只需要将下面的代码放到页面JS脚本中执......
  • 前端vscode配置
    {"window.zoomLevel":1,"liveServer.settings.donotShowInfoMsg":true,"editor.tabSize":2,"editor.tabCompletion":"on","editor.fontSize":16,"git.autofetch":true,"editor.stic......
  • 使用js语文json字符串通过get方式传值,然后用request接收
    在JavaScript中,如果你有一个JSON字符串,并且你想通过GET请求或者其他HTTP请求来传递这个字符串,你可以使用encodeURIComponent函数来确保字符串能够安全地通过URL传输。//假设我们有一个JSON对象constjsonObject={name:"John",age:30,city:"NewYork"};//将......
  • js逆向实战之一品威客signature参数解密
    url:https://www.epwk.com/login.html分析过程输入用户名和密码,看触发的流量包。signature参数明显是被加密过的,接下来就是去寻找加密的过程。关键词搜索signature。有两处,第二处是个固定值不需要看,关注点在第一处。点进去看对应的代码,并打断点,重新登录,触发该断点。......
  • js递归实现深拷贝
    functiongetType(data){returnObject.prototype.toString.call(data).replace(']','').substring(8)}function_clone(data,res){consttype=getType(data)if(type==='Object'){Object.keys(data).map(i=>{......
  • js AddDays ,AddYears
    //日期类型变量格式化,默认格式"xxxx-xx-xx"Date.prototype.Format=function(fmt){fmt=fmt||"yyyy-MM-dd";varo={"M+":this.getMonth()+1,//月份"d+":this.getDate(),//日"h+":......
  • three.js使用Instanced Draw+Frustum Cull+LOD来渲染大场景(开源)
    大家好,本文使用three.js实现了渲染大场景,在移动端也有较好的性能,并给出了代码,分析了关键点,感谢大家~关键词:three.js、InstancedDraw、大场景、LOD、FrustumCull、优化、Web3D、WebGL、开源代码:Github我正在承接Web3D数字孪生项目,具体介绍可看承接各种Web3D业务加QQ群交流:106......
  • 前端
    HTML初解html标签分类标签为什么要分类?分类可以使html结构更加清晰标签:都有自己的名字和特征,分为:单标签和双标签单标签:就是没有结束标签常用img--br--hr-双标签:有开始和结束标签例如.div可以在双标签中去嵌入子标签和文本内容(文字和图像)模式分类(重点)块......