@liruiyi962464
2025-06-16T02:07:24.000000Z
字数 3920
阅读 22
朔黄
在 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 28
nginx
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-rtmp
ports:
- "1935:1935"
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ffmpeg-transcoder:
image: jrottenberg/ffmpeg
command: >
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.flv
jeecg-boot:
image: your-jeecg-boot-image
ports:
- "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 视频流的转码、传输和播放,满足不同场景的需求。