在实际项目中,经常会遇到这样的需求:
👉 公司内网有大量摄像头(RTSP)
👉 需要在公网访问(网页播放 / 小程序 / 监控平台)
👉 但公网带宽有限 or 摄像头无法直接暴露
这篇文章教你一套稳定可扩展方案:
✅ 内网统一拉流
✅ 转 RTMP 推送
✅ 通过内网穿透暴露到公网
✅ 支持几十到上百路摄像头
🧠 一、整体架构
摄像头 (RTSP)
↓
内网 SRS + FFmpeg(拉流转推)
↓ RTMP
内网穿透(FRP)
↓
公网 SRS(可选)
↓
浏览器播放(FLV / HLS)
👉 核心思想:
- 摄像头只在内网
- 统一由 SRS + FFmpeg 拉流
- 通过 FRP 暴露服务
- 公网只负责“分发”,不直接拉摄像头
⚙️ 二、启动内网 SRS
1️⃣ 删除旧容器
docker rm -f srs-inner
2️⃣ 启动 SRS(内网)
docker run -d --name srs-inner --restart always \
-p 1935:1935 \
-p 18080:8080 \
-p 1985:1985 \
registry.cn-hangzhou.aliyuncs.com/ossrs/srs:latest
端口说明
| 端口 | 作用 |
|---|---|
| 1935 | RTMP 推流 |
| 18080 | HTTP-FLV / HLS 播放 |
| 1985 | SRS API |
🎥 三、拉取摄像头 RTSP 并转推 RTMP
示例:摄像头 188
docker exec -d srs-inner /usr/local/srs/objs/ffmpeg/bin/ffmpeg \
-rtsp_transport tcp \ -i "rtsp://你的账号:你的密码@192.168.6.188:554/h265/ch1/sub/av_stream" \
-c:v libx264 -preset ultrafast -tune zerolatency \ -b:v 600k -maxrate 800k -bufsize 1200k \
-r 12 -g 24 \
-c:a aac -b:a 24k -ar 8000 \
-f flv rtmp://127.0.0.1:1935/live/cam188
🔍 参数解释(重点)
| 参数 | 作用 |
|---|---|
-rtsp_transport tcp | 防止丢包(强烈建议) |
libx264 | 转码为 H264 |
-preset ultrafast | 降低 CPU |
-g 50 | GOP,影响延迟 |
-f flv | 推 RTMP 必须 |
🌐 四、播放地址
🎯 内网播放
👉 FLV(推荐低延迟):
http://内网IP:18080/live/cam188.flv
👉 HLS(兼容性好):
http://内网IP:18080/live/cam188.m3u8
🌍 五、通过 FRP 暴露到公网
frpc 示例
这部分内容之前有单独发文章:https://juejin.cn/post/7612599599946989603
公网访问地址
http://公网IP:18080/live/cam188.flv
🚀 六、大规模摄像头优化(重点)
如果你有:
👉 50路 / 100路摄像头
必须注意 👇
1️⃣ CPU 压力(最大瓶颈)
❌ 当前方案问题:
RTSP(H265) → 转码(H264) → 推流
👉 很吃 CPU!
✅ 优化方案(强烈推荐)
👉 如果摄像头支持 H264:
-c:v copy
替换为:
-c:v copy -c:a aac
👉 直接零转码,CPU 几乎不占用
2️⃣ 带宽优化
| 场景 | 建议 |
|---|---|
| 内网 → 公网 | 控码率 |
| 多人观看 | 用公网 SRS 分发 |
3️⃣ 推流风暴问题
100个 ffmpeg 同时启动会:
👉 打爆 CPU / 网络
✅ 解决:
- 分批启动
- 或写脚本限流
⚠️ 七、常见坑
❌ 1. 播放 404
http miss file=playlist.m3u8
👉 原因:
- 没有推流成功
查看流是否拉起来了 docker exec srs-inner ps aux | grep ffmpeg
❌ 3. 卡顿 / 延迟高
👉 优化:
- 用 FLV,不用 HLS
- GOP 调小(如 25)
🧩 八、进阶架构(推荐)
如果你要做“生产级”:
内网:
SRS(拉流聚合)
公网:
SRS(分发)
好处:
👉 公网带宽压力更小
👉 支持上千人观看
🎯 总结
这套方案的核心优势:
✅ 摄像头不暴露公网
✅ 内网统一管理
✅ 支持大规模扩展
✅ 延迟低(FLV)
✅ 成本可控
💬 最后建议(实战经验)
如果你是:
👉 10路以内 → 随便搞
👉 50路 → 必须用 copy
👉 100路+ → 一定要做“内外网双 SRS 架构”