SRS + 内网穿透实现摄像头 RTSP 推流到公网(支持大规模摄像头)

12 阅读3分钟

在实际项目中,经常会遇到这样的需求:

👉 公司内网有大量摄像头(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

端口说明

端口作用
1935RTMP 推流
18080HTTP-FLV / HLS 播放
1985SRS 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 50GOP,影响延迟
-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 架构”