VUE+webrtc-streamer实战:从零搭建跨平台监控视频实时播放系统
2026/5/16 13:04:24 网站建设 项目流程

1. 为什么选择VUE+webrtc-streamer这套方案

第一次接触监控视频实时播放需求时,我花了整整两周时间对比各种技术方案。市面上常见的方案比如FFmpeg转码+WebSocket、RTMP协议推流、HLS切片播放都试了个遍,最后发现webrtc-streamer这个神器简直是监控领域的"瑞士军刀"。

先说个真实案例:去年给某连锁超市做仓库监控系统时,他们的需求是要在网页上同时查看20路摄像头,延迟必须控制在500ms以内。用传统方案要么延迟高(HLS普遍有3-5秒延迟),要么兼容性差(RTMP需要Flash),直到发现webrtc-streamer配合VUE前端,才真正解决了问题。实测下来,这套组合有三大优势:

  1. 超低延迟:WebRTC天生的P2P特性,从摄像头到浏览器平均延迟仅300ms左右
  2. 跨平台支持:一套代码搞定Windows/Linux/Mac,甚至树莓派都能跑
  3. 硬件解码:直接调用浏览器内置的H264解码能力,CPU占用率比FFmpeg转码低80%

不过要注意,webrtc-streamer最适合的是H264编码的RTSP流。如果摄像头输出的是H265,需要先在摄像头管理后台改成H264编码格式,否则会出现黑屏问题。这个坑我当年可是踩得结结实实。

2. 开发环境搭建全攻略

2.1 准备工具清单

在开始敲代码前,建议先准备好这些工具(以Windows为例,其他系统类似):

  • VSCode:前端开发神器,插件推荐Volar和ESLint
  • Node.js 16+:建议用nvm管理多版本
  • webrtc-streamer:从GitHub release页面下载对应版本
  • Vue CLI:官方脚手架工具
  • 测试摄像头:海康/大华都行,记得提前拿到RTSP地址

这里有个小技巧:下载webrtc-streamer时,如果网络环境不好,可以用这个国内镜像地址替换github.com:

https://ghproxy.com/https://github.com/mpromonet/webrtc-streamer/releases

2.2 项目初始化

打开终端,按顺序执行这些命令:

# 创建Vue3项目 npm init vue@latest webrtc-monitor # 进入项目目录 cd webrtc-monitor # 安装必要依赖 npm install element-plus axios --save

初始化完成后,建议先修改vite.config.js配置代理,避免后续跨域问题:

export default defineConfig({ server: { proxy: { '/api': { target: 'http://127.0.0.1:8000', changeOrigin: true } } } })

3. 本地调试实战技巧

3.1 启动webrtc-streamer服务

解压下载的webrtc-streamer压缩包后,我习惯用命令行启动,方便查看日志:

# Windows ./webrtc-streamer.exe -H 8000 # Linux/Mac ./webrtc-streamer -H 8000

启动成功后,浏览器访问http://localhost:8000应该能看到测试页面。如果遇到端口占用,可以用-H参数指定其他端口。

3.2 前端集成关键步骤

把webrtc-streamer的JS文件复制到Vue项目时,我推荐放在public/libs目录下,然后在index.html这样引入:

<script src="/libs/adapter.min.js"></script> <script src="/libs/webrtcstreamer.js"></script>

视频组件我一般会做以下优化:

<template> <div class="video-container"> <video id="video" autoplay muted playsinline :style="{ width: videoWidth + 'px' }" @loadedmetadata="handleLoaded" ></video> <div class="controls"> <el-button @click="toggleFullscreen">全屏</el-button> <el-button @click="snapshot">截图</el-button> </div> </div> </template>

注意几个关键属性:

  • muted:自动播放必须设置静音
  • playsinline:防止iOS浏览器自动全屏
  • @loadedmetadata:用于获取视频原始分辨率

4. 生产环境部署指南

4.1 服务端后台运行

在Ubuntu服务器上,用systemd托管服务最稳定。创建/etc/systemd/system/webrtc.service

[Unit] Description=WebRTC Streamer After=network.target [Service] User=ubuntu ExecStart=/opt/webrtc-streamer/webrtc-streamer -H 8000 Restart=always [Install] WantedBy=multi-user.target

然后执行:

sudo systemctl daemon-reload sudo systemctl start webrtc sudo systemctl enable webrtc

4.2 性能优化配置

高并发场景下,建议修改这些启动参数:

./webrtc-streamer \ -H 8000 \ -S /tmp/webrtc.sock \ # 使用Unix Socket减少TCP开销 -s /ssl/cert.pem \ # HTTPS证书路径 -k /ssl/key.pem \ # SSL密钥路径 --max-clients=50 \ # 最大连接数 --ice-servers="stun:stun.l.google.com:19302" # 添加STUN服务器

5. 常见问题解决方案

问题1:视频能连接但画面卡顿

  • 检查摄像头输出码率,建议不超过2048kbps
  • 在webrtc-streamer启动时添加--bitrate=1500参数限制码率

问题2:iOS设备无法播放

  • 确保RTSP流是H264 Baseline Profile
  • 在Safari浏览器需要额外添加crossorigin="anonymous"属性

问题3:多路视频内存泄漏

  • 在Vue组件的beforeUnmount钩子中必须调用disconnect()
  • 定期重启服务(可以用cronjob每天凌晨重启)

记得第一次上线时,我们没注意内存泄漏问题,结果服务跑了三天就把16G内存吃光了。后来在代码里加了内存监控才解决:

setInterval(() => { console.log(`Memory usage: ${process.memoryUsage().heapUsed / 1024 / 1024} MB`); }, 60000);

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询