基于SRS的GB28181协议摄像头Web实时监控实战指南
每次调试海康摄像头的实时监控功能时,总会遇到各种技术难题。传统方案依赖FFmpeg进行流转换,不仅配置复杂,延迟问题也让人头疼。最近在智慧园区项目中,我们成功用SRS流媒体服务器实现了GB28181协议摄像头的低延迟Web播放,效果远超预期。本文将分享这套方案的完整实施过程。
1. 为什么选择SRS替代FFmpeg方案
在视频监控领域,GB28181协议已经成为行业标准。传统做法是通过FFmpeg将摄像头RTSP流转码为Web兼容格式,但这种方式存在几个致命缺陷:
- 高延迟:转码过程通常产生3-5秒延迟
- 资源消耗大:每路视频需要独立转码进程
- 稳定性差:长时间运行容易出现内存泄漏
相比之下,SRS原生支持GB28181协议,可以直接接收摄像头SIP信令和RTP媒体流,无需中间转码。我们实测的端到端延迟可以控制在800ms以内,CPU占用率降低60%。
性能对比表:
| 指标 | FFmpeg方案 | SRS方案 |
|---|---|---|
| 平均延迟 | 3.2s | 0.8s |
| CPU占用(1080P) | 25%/路 | 8%/路 |
| 内存占用 | 300MB/路 | 50MB/路 |
2. SRS服务器部署与GB28181配置
2.1 环境准备与编译安装
推荐使用CentOS 7或Ubuntu 18.04以上系统。首先安装基础依赖:
# CentOS yum install -y git gcc-c++ make # Ubuntu apt-get update && apt-get install -y git build-essential获取SRS gb28181分支源码并编译:
git clone -b feature/gb28181 https://github.com/ossrs/srs.git cd srs/trunk ./configure --gb28181=on make提示:编译过程约需10分钟,视服务器性能而定。若遇到依赖问题,可参考官方文档补充安装。
2.2 关键配置详解
配置文件conf/push.gb28181.conf中有几个关键参数需要特别注意:
stream_caster { enabled on; caster gb28181; output rtmp://127.0.0.1:1935/live/[stream]; listen 9000; rtp_port_min 58200; rtp_port_max 58300; host $CANDIDATE; auto_create_channel on; sip { enabled on; listen 5060; serial 34020000002000000001; realm 3402000000; auto_play on; } }- host $CANDIDATE:设置服务器公网IP,可通过环境变量配置
- auto_create_channel:自动创建媒体通道,简化配置流程
- rtp_port_range:设置RTP端口范围,需确保防火墙开放
3. 海康摄像头SIP配置实战
3.1 摄像头网络配置
- 登录摄像头Web界面(默认IP通常为192.168.1.64)
- 进入"配置 > 网络 > 高级设置 > 平台接入"
- 填写SIP服务器信息:
- 协议类型:GB/T28181
- SIP服务器ID:需与SRS配置中的serial一致
- SIP服务器地址:SRS服务器IP
- SIP服务器端口:5060
- 传输协议:UDP
注意:部分新款海康摄像头需要先启用"平台接入"功能才能看到相关配置项。
3.2 常见问题排查
- 注册失败:检查serial和realm是否匹配
- 视频无画面:确认RTP端口(9000)和范围(58200-58300)已开放
- 延迟过高:尝试设置
wait_keyframe off
4. Web前端集成方案
4.1 FLV低延迟播放方案
推荐使用flv.js实现浏览器播放:
<script src="https://cdn.jsdelivr.net/npm/flv.js@1.6.2/dist/flv.min.js"></script> <video id="videoElement" controls muted></video> <script> if (flvjs.isSupported()) { const flvPlayer = flvjs.createPlayer({ type: 'flv', url: 'http://your-srs-server:8080/live/34020000001320000001.flv' }); flvPlayer.attachMediaElement(videoElement); flvPlayer.load(); flvPlayer.play(); } </script>4.2 WebRTC超低延迟方案
对于需要更低延迟(300ms以内)的场景,可以使用SRS的WebRTC功能:
const pc = new RTCPeerConnection(); pc.addTransceiver('video', { direction: 'recvonly' }); pc.onicecandidate = e => { if (e.candidate) { // 发送candidate到信令服务器 } }; pc.ontrack = e => { videoElement.srcObject = e.streams[0]; }; // 通过API获取SDP offer fetch('/webrtc/api/offer', { method: 'POST', body: JSON.stringify({ streamurl: 'webrtc://your-srs-server/live/34020000001320000001' }) }).then(res => res.json()).then(offer => { pc.setRemoteDescription(offer); pc.createAnswer().then(answer => { pc.setLocalDescription(answer); // 发送answer到信令服务器 }); });5. 生产环境优化建议
在实际项目部署中,我们总结了以下经验:
网络配置:
- 为SRS服务器配置独立网卡
- 开启Jumbo Frame提升大流量传输效率
- 使用
ethtool优化网卡参数
性能调优:
# 调整内核参数 echo 'net.core.rmem_max=26214400' >> /etc/sysctl.conf echo 'net.core.wmem_max=26214400' >> /etc/sysctl.conf sysctl -p高可用方案:
- 使用Keepalived实现VIP漂移
- 配置多台SRS服务器做负载均衡
- 实现NAT穿透确保内外网互通
在最近一个智慧工地项目中,我们使用这套方案稳定支持了200+路摄像头并发,峰值带宽达到2Gbps,平均延迟控制在1秒以内。