纯前端ELECTRON+VUE+FFMPEG实现多路播放RTSP流

这篇具有很好参考价值的文章主要介绍了纯前端ELECTRON+VUE+FFMPEG实现多路播放RTSP流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

近期有项目需求前端播放rtsp视频流,项目是由electron+vue3搭建,没有后端,因此需要在前端实现解析rtsp流及播放,经过多方考察最后选用了ffmpeg+jsmpeg方案实现,具体实现是参考了@牧也の旅行 大佬的这篇文章 原文地址 实现的,感谢@牧也の旅行 一直在回复我的各种小白问题,这里记录一下做这个功能时遇到的问题和解决方法:
主进程中的程序及其他配置参见原文,这里就不赘述了。
1,原文是单路播放,我的需求需要多路播放:
本来预想是展示16路,查资料也是说可以显示16路,但实际发现浏览器中只能稳定显示8路,超过后浏览器经常会报WARNING: Too many active WebGL contexts. Oldest context will be lost.并自动从第一路开始销毁,无法恢复(这里一直没有找到解决办法):
采用的方式是在vue组件中预先设置好canvas,id就是rtsp流的通道号

<div  v-for="i in 8" :key="i" style="padding:5px;" >   
       <canvas class="preview-video-canvas" :id="'chn'+(i-1).toString(16)"></canvas>      
  </div>

编写一个video.js 来播放多路

const {ipcRenderer} = require('electron');
import MpegPlayer from 'jsmpeg-player'

export class videoRtspPlayer {
    #pc;
    constructor(elements, opts = {}) {
        this.opts = opts;
        this.#pc = [];
        this.videoElement = Array.from(elements);
        this.baseUrl = this.init(this.opts);
    }
    /**
     * 创建视频播放url
     * @param {Object} opts 传入rtsp地址
     * @return {Promise<void>}
     */
    init(opts){
        return `rtsp://${opts.addr}:666/live/`;
    }
    /**
     * 播放
     * @return {Promise<void>}
     */
     play() {
           this.videoElement.forEach(async (video,index)=>{
               setTimeout(()=>{
                let pc;
                const url =`${this.baseUrl}${video.id}`;
                const res = ipcRenderer.sendSync('openRtsp', url,index);
                if (res.code === 200) {
                   //  pc = new MpegPlayer.VideoElement(video, res.ws); 这里由于我的播放位置是固定的,因此使用 MpegPlayer.Player方法 ,与原文不同
                    pc = new MpegPlayer.Player(res.ws,{
                        canvas:video,
                        videoBufferSize:1024*1024, //增加一些缓存
                    })
                    pc['rtsp'] = url;
                 }
                pc && this.#pc.push(pc);
               },index*100)
            })
    }
    /**
     * 停止
     */
    stop() {
        console.log(this.#pc)
        this.#pc.forEach(pc=>{
            pc.stop();
            ipcRenderer.sendSync('closeRtsp', pc.rtsp);   
        })
        this.#pc = [];
    }
}

electron/main.js中稍作改动,端口改为固定8个,不再使用addPort++;
vue中调用

import {videoRtspPlayer} from "../../common/Video";
let videoPlayer;
const netState = {
   addr: 你的rtsp地址
}
const initVideo = () =>{
      //开启视频预览
      let videos = document.getElementsByClassName('preview-video-canvas');
      videoPlayer = new videoRtspPlayer(videos,netState);
    }

onMounted(() => {
  initVideo();
  videoPlayer.play() 
})
onUnmounted(()=>{
  videoPlayer.stop();
})

至此,在开发环境,我可以正常开启8路rtsp视频预览了,通过配置Stream的尺寸,减小播放窗口,我的内存和cpu占用还算理想。

2、接着我就遇到了这个项目最大的坑:打包。打包后的程序,安装完运行起来一直报:

A JavaScript error occurred in the main process
Uncaught Exception:Error: spawn D: ldeaProjects md scs dist electron ffmpeg.exe ENOENTat ChildProcess.handle.onexit (node:internal/child process:283:19)at onErrorNT (node:internal/child process:478:16)at process.processTicksAndRejections (node:internal/process/task queues:83:21),

总的意思就是找不到 ffmpeg.exe 这个文件,查了一整天资料研究打包修改配置,我是使用electron-builder打包,配置文件在vue.config.js中,关键步骤如下:
1)将 ffmpeg.exe 拷贝到项目根目录;
2)配置中添加:

 electronBuilder: {
          ...
            builderOptions:{
              ...
                "asar": true,               
                "extraResources":['ffmpeg.exe'],
                ...
                }
        ...
 }

这样打包安装后,ffmpeg.exe就会出现在安装目录的resources/下,
electron/main.js中下面这句需要修改

// ffmpegPath: app.isPackaged ? ffmpegPath.replace('app.asar', 'app.asar.unpacked') : ffmpegPath, //改为下面那句
 ffmpegPath: app.isPackaged ? ffmpegPath.replace('app.asar', '') : ffmpegPath,

之后打包-安装-播放成功~文章来源地址https://www.toymoban.com/news/detail-760974.html

到了这里,关于纯前端ELECTRON+VUE+FFMPEG实现多路播放RTSP流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • electron+vue 实现静默打印

    我的electron版本:^12.0.0; vue版本:^3.2.13。 我是通过webview实现的。 实现原理:webview类似于iframe,其实是electron中的一个内嵌窗口,打印的也就是这个内嵌窗口的内容。 所以共需要两个文件: 一个是vue文件,主要承担数据预处理工作;第二个是html文件,主要承担显示打印内容工

    2024年02月10日
    浏览(28)
  • ffmpeg+nginx实现rtsp协议摄像头web端播放

    nginx(需要安装rtmp模块) ffmpeg 6.0 vlc播放器(本地播放验证) 这些资源已经上传需要的可以自己下载,这个压缩包里的nginx已经安装好所需模块,解压即可使用 下载地址 如果你使用的是海康威视得摄像头构成一般为rtsp://摄像头用户名:密码@摄像头IP:摄像头端口/Streaming/Chann

    2024年02月14日
    浏览(44)
  • Vite + Vue3 + Electron实现进程通信

    Electron 是一个基于 Chromium 和 Node.js 的桌面应用程序开发框架,而 Vue3 则是一种流行的前端框架。将两者结合使用可以快速地打造出跨平台的桌面应用程序。在这种组合中,Electron 提供了强大的桌面应用开发能力,而 Vue3 则提供了易用的 UI 组件和开发体验 Electron 内置了 Chrom

    2024年02月12日
    浏览(45)
  • 【vue2】前端如何播放rtsp 视频流,拿到rtsp视频流地址如何处理,海康视频rtsp h264 如何播放

    最近在写vue2 项目其中有个需求是实时播放摄像头的视频,摄像头是 海康 的设备,搞了很长时间终于监控视频出来了,记录一下,放置下次遇到。文章有点长,略显啰嗦请耐心看完。 测试?测试什么?测试rtsp视频流能不能播放。 video mediaplay官网 即(VLC) 下载、安装完VLC后

    2024年02月05日
    浏览(55)
  • 在线WebOffce在HTML/VUE/Electron纯前端网页编辑Office之打开Word后自动处于修订模式

    在线办公协同办公过程中,对于老板给出的文档修改,如果在错别字方面都要自己一个个字去看的话也太浪费时间了,其实word上就有一个修订模式,可以帮助大家高效完成文档的修改,在线WebOffce在HTML/VUE/Electron纯前端网页编辑Office之打开Word后自动处于修订模式? 第一步:下

    2024年01月21日
    浏览(52)
  • 前端10年进化 Node.js、模块化、CommonJS、AMD、CMD、Webpack、Vue-cli、Electron-vue

    模块化的概念在软件开发领域已经存在很长时间,但在 JavaScript 中的模块化发展相对较晚。以下是对您提出的问题的回答: 提出时间:JavaScript 中的模块化概念相对较早地提出于 CommonJS 规范。CommonJS 是一种 JavaScript 模块化规范,最早在 2009 年由 Ryan Dahl 和其他社区成

    2024年02月11日
    浏览(79)
  • Windows上搭建rtsp-simple-server流媒体服务器实现rtsp、rtmp等推流以及转流、前端html与Vue中播放hls(m3u8)视频流

    Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流: Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流_霸道流氓气质的博客-CSDN博客 上面讲了Nginx-http-flv-module+flv.js进行流媒体服务器搭建和前端播放视频流的过

    2024年02月01日
    浏览(59)
  • 前端VUE播放RTSP、RTMP、HLS、FLV视频流的解决方案

    最近有个需求是前端在浏览器显示摄像头传回的RTSP视频流,我和后端都没做过视频流的项目,所以一步步摸索过来,方法和经验供大家参考。前端采用的技术有VUE+video.js+flv.js 从上图可以看出,RTSP流不能直接在浏览器播放,所以需要转码: RTMP的流需要在浏览器中用flash播放

    2024年02月06日
    浏览(59)
  • Electron:Electron整合vue

    主要思路:分别启动两个进程,一个是vue,另一个是electron。然后在electron通过loadURL去引入vue的主页面。但怎么才能将这两个项目整合成一键启动呢?请看后文! TODO

    2024年01月19日
    浏览(38)
  • Vue 3 + ffmpeg + wasm 实现前端视频剪辑、音频剪辑、音波展示、视频抽帧、gif抽帧、帧播放器、字幕、贴图、时间轴、素材轨道

    预览 www.bilibili.com/video/BV1YT411Y7YJ 技术栈: 💪 Vue 3、Vue-Router 4、Vite、pnpm、esbuild、TypeScript ☀️ Pinia 状态管理 🌪 Tailwind 原子css集成 💥 ffmpeg、wasm 底层音视频处理集成 功能 多轨道时间轴,支持帧缩放,时间缩放 支持多种类型轨道的添加删除 多功能轨道调节,支持音视频轨

    2024年02月11日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包