@liruiyi962464
2025-06-16T02:07:24.000000Z
字数 3920
阅读 112
朔黄
在 Jeecg-Boot 框架中实现 RTSP 视频流的处理,需结合后端转码、流媒体服务器分发以及前端播放。以下是详细解决方案:
RTSP 源(摄像头) → FFmpeg 转码 → 流媒体服务器(Nginx-RTMP/SRS) → HTTP-FLV/HLS/WebSocket-FLV → Jeecg-Boot 前端播放
flv.js(H.264)、h265web.js(H.265)、hls.js(HLS)。使用 FFmpeg 将 RTSP 流转码为 HTTP-FLV 或 WebSocket-FLV。
ffmpeg -i rtsp://admin:password@192.168.1.64:554/h264/ch1/main/av_stream \-c:v libx264 -preset fast -crf 23 \-c:a aac -f flv \http://localhost:8080/live/stream.flv
ffmpeg -i rtsp://admin:password@192.168.1.64:554/h265/ch1/main/av_stream \-c:v libx265 -preset fast -crf 28 \-c:a aac -f flv \- | websockify --web /path/to/web 8081
在 nginx.conf 中配置 RTMP 和 HTTP-FLV:
rtmp {server {listen 1935;application live {live on;exec_static ffmpeg -i rtmp://localhost/live/$name \-c copy -f flv http://localhost:8080/live/$name.flv;}}}http {server {listen 8080;location /live {flv_live on;add_header 'Access-Control-Allow-Origin' '*';}}}
提供转码后的流地址给前端:
@RestController@RequestMapping("/api/stream")public class StreamController {@GetMapping("/flv")public String getFlvStream() {return "http://localhost:8080/live/stream.flv";}@GetMapping("/ws-flv")public String getWsFlvStream() {return "ws://localhost:8081";}}
npm install flv.js h265web.js hls.js --save
<template><div><video id="flvPlayer" controls autoplay></video></div></template><script>import flvjs from 'flv.js';export default {mounted() {if (flvjs.isSupported()) {const video = document.getElementById('flvPlayer');const flvPlayer = flvjs.createPlayer({type: 'flv',url: 'http://localhost:8080/api/stream/flv',});flvPlayer.attachMediaElement(video);flvPlayer.load();flvPlayer.play();}},};</script>
<template><div id="h265-player"></div></template><script>import H265Player from 'h265web.js';export default {mounted() {const player = new H265Player({container: document.getElementById('h265-player'),videoUrl: 'ws://localhost:8080/api/stream/ws-flv',width: 800,height: 450,});player.init();},};</script>
<template><div><video id="hlsPlayer" controls autoplay></video></div></template><script>import Hls from 'hls.js';export default {mounted() {const video = document.getElementById('hlsPlayer');if (Hls.isSupported()) {const hls = new Hls();hls.loadSource('http://localhost:8080/api/stream/hls.m3u8');hls.attachMedia(video);} else if (video.canPlayType('application/vnd.apple.mpegurl')) {video.src = 'http://localhost:8080/api/stream/hls.m3u8';}},};</script>
| 协议 | 延迟 | 兼容性 | 适用场景 |
|---|---|---|---|
| HTTP-FLV | 1-2秒 | 较好 | 实时监控 |
| WebSocket-FLV | 1-2秒 | 较差 | H.265 视频流 |
| HLS | 3-10秒 | 最好 | 监控回放、点播 |
-preset ultrafast -tune zerolatency-c:v libx264 -profile:v baseline -level 3.0-c:v libx265 -preset fast -crf 28nginx
location /live {
secure_link $arg_st,$arg_e;
secure_link_md5 "secret$arg_e$uri";
if ($secure_link = "") {
return 403;
}
}
h265web.js 或将 H.265 转码为 H.264。hls_time 参数(如从 4 秒改为 2 秒)。nginx
add_header 'Access-Control-Allow-Origin' '*';
-hwaccel cuda)。
version: '3'services:nginx-rtmp:image: alfg/nginx-rtmpports:- "1935:1935"- "8080:80"volumes:- ./nginx.conf:/etc/nginx/nginx.confffmpeg-transcoder:image: jrottenberg/ffmpegcommand: >ffmpeg -i rtsp://admin:password@192.168.1.64:554/h264/ch1/main/av_stream-c:v libx264 -preset fast -crf 23-c:a aac -f flv http://nginx-rtmp:8080/live/stream.flvjeecg-boot:image: your-jeecg-boot-imageports:- "80:8080"
在 src/router/index.js 中注册播放器页面:
{path: '/video-player',name: 'VideoPlayer',component: () => import('@/views/video-player/VideoPlayer.vue'),meta: { title: '视频播放器' },}
h265web.js)。通过以上方案,你可以在 Jeecg-Boot 框架中实现 RTSP 视频流的转码、传输和播放,满足不同场景的需求。