1. 为什么需要跨平台RTSP视频流方案RTSP协议作为监控摄像头、网络摄像机等设备的通用传输协议在实际项目中经常遇到浏览器兼容性问题。主流浏览器如Chrome、Firefox早已不再支持直接播放RTSP流这给需要网页展示监控画面的项目带来了巨大挑战。我在智慧园区项目中就遇到过这个痛点客户要求在大屏展示20路摄像头画面但前端工程师发现浏览器根本无法直接播放RTSP。经过多次技术验证最终选择了FFmpegNginx的转码方案将RTSP转为HTTP-FLV协议实现了所有现代浏览器的无缝支持。这个方案的核心优势在于跨平台兼容Windows/Linux服务器均可部署低延迟实测延迟控制在1秒以内高可用Nginx作为中间层具备负载均衡能力扩展性强支持动态增减视频源2. 环境准备与工具安装2.1 FFmpeg安装指南FFmpeg是整个方案的核心转码工具安装时需要注意版本兼容性。建议使用4.3以上版本以获得更好的H.264编码支持。Windows环境安装从官网下载静态编译版本解压到C:\ffmpeg目录添加bin目录到系统PATHsetx /M PATH %PATH%;C:\ffmpeg\bin验证安装ffmpeg -versionLinux环境安装以CentOS为例yum install epel-release yum install ffmpeg ffmpeg-devel2.2 Nginx与RTMP模块编译Nginx需要编译安装nginx-http-flv-module模块才能支持FLV直播流# 安装依赖 yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel # 下载源码 wget http://nginx.org/download/nginx-1.20.1.tar.gz git clone https://github.com/winshining/nginx-http-flv-module.git # 编译安装 tar -zxvf nginx-1.20.1.tar.gz cd nginx-1.20.1 ./configure --add-module../nginx-http-flv-module make make install3. 服务端实现方案3.1 SpringBoot命令调用封装通过Java调用FFmpeg需要处理不同操作系统的命令差异。我封装了一个通用工具类public class FFmpegExecutor { public static void startStream(String rtspUrl, String rtmpUrl) { String os System.getProperty(os.name).toLowerCase(); String command; if (os.contains(win)) { command String.format(ffmpeg -rtsp_transport tcp -i \%s\ -c:v libx264 -preset ultrafast -tune zerolatency -c:a aac -f flv \%s\, rtspUrl, rtmpUrl); } else { command String.format(ffmpeg -f rtsp -rtsp_transport tcp -i %s -codec copy -f flv %s, rtspUrl, rtmpUrl); } try { Runtime.getRuntime().exec(command); } catch (IOException e) { e.printStackTrace(); } } }3.2 Nginx流媒体服务器配置关键配置在nginx.conf中添加RTMP和HTTP-FLV支持rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; } } } http { server { listen 8080; location /live { flv_live on; add_header Access-Control-Allow-Origin *; } } }4. 前端低延迟播放实现4.1 Vue集成flv.js安装flv.js依赖npm install flv.js --save视频播放组件实现template video refvideoPlayer controls muted autoplay/video /template script import flvjs from flv.js; export default { props: [streamUrl], mounted() { if (flvjs.isSupported()) { this.player flvjs.createPlayer({ type: flv, url: this.streamUrl, isLive: true, stashInitialSize: 128 }); this.player.attachMediaElement(this.$refs.videoPlayer); this.player.load(); this.player.play(); } }, beforeDestroy() { this.player?.destroy(); } } /script4.2 性能优化技巧通过实际项目验证以下参数能显著降低延迟设置-preset ultrafast -tune zerolatency编码参数flv.js配置stashInitialSize: 128启用TCP传输-rtsp_transport tcp关闭音频流-an参数5. 全链路调试与问题排查常见问题及解决方案问题1Nginx接收不到流检查防火墙是否开放1935端口验证FFmpeg命令是否执行成功查看Nginx错误日志logs/error.log问题2前端播放卡顿降低视频分辨率-vf scale1280:-1调整关键帧间隔-g 50使用硬件加速如果支持-hwaccel cuvid问题3高并发场景崩溃增加Nginx worker进程数配置RTMP的out_queue参数考虑使用集群部署方案6. 进阶应用场景6.1 多路视频流管理通过动态生成application名称实现多路流隔离String appName stream_ cameraId; String rtmpUrl rtmp://nginx-server:1935/ appName /room;6.2 移动端适配方案针对移动端网络特点优化参数ffmpeg -rtsp_transport tcp -i rtsp://... -c:v libx264 -profile:v baseline -level 3.0 -preset ultrafast -tune zerolatency -vf scale640:360 -f flv rtmp://...6.3 安全加固措施配置Nginx鉴权模块启用HTTPS加密传输实现IP白名单限制7. 部署方案对比部署方式优点缺点物理机部署性能最优维护成本高Docker容器化快速部署网络配置复杂云服务器弹性扩展带宽成本高边缘计算节点降低中心节点压力需要分布式管理8. 监控与维护建议添加以下监控指标FFmpeg进程存活状态单路流CPU占用率端到端延迟时间内存使用情况可以通过SpringBoot Actuator暴露健康检查接口GetMapping(/stream/health) public ResponseEntity? checkStreamHealth() { // 实现健康检查逻辑 }9. 项目实战经验在智慧工地项目中我们遇到阴雨天摄像头断流问题。最终发现是RTSP的TCP传输缓冲区不足导致通过调整以下参数解决-rtsp_transport tcp -buffer_size 1024000另一个坑是Nginx的worker连接数限制在高并发场景下需要调整events { worker_connections 10240; }10. 技术方案对比与WebRTC方案相比本方案的优势在于对老旧摄像头兼容性更好服务器资源消耗更低实现复杂度更小支持更多并发流而与HLS方案相比本方案的延迟优势明显实测可以控制在500ms以内满足绝大多数实时监控场景的需求。