# gb28181
**Repository Path**: gowvp/gb28181
## Basic Information
- **Project Name**: gb28181
- **Description**: GB28181 - 2022 NVR | ONVIF/RTMP/RTSP | ZLMediaKit | 本地 YOLO 检测 | 私有部署 | Frigate
- **Primary Language**: Go
- **License**: GPL-3.0
- **Default Branch**: main
- **Homepage**: http://gowvp.golang.space:15123
- **GVP Project**: No
## Statistics
- **Stars**: 174
- **Forks**: 47
- **Created**: 2025-02-05
- **Last Updated**: 2026-07-03
## Categories & Tags
**Categories**: multimedia
**Tags**: onvif, GB28181, gb28181-2022, RTMP, RTSP
## README
[English](./README.md) | **中文**
|
|
|
|-|-|
# GB28181 视频监控平台 开箱即用
基于 GB28181-2022 标准实现的网络视频平台,同时支持 2016/2011 版本,支持 ONVIF/RTMP/RTSP 等协议,支持 yolo 检测告警。
## 在线演示平台
+ [在线演示平台 :) ](http://gowvp.golang.space:15123/)

|||||
|-|-|-|-|
## 应用场景:
+ 支持浏览器无插件播放摄像头视频。
+ 支持国标设备(摄像机、平台、NVR等)设备接入
+ 支持非国标(rtsp, rtmp,直播设备等等)设备接入,充分利旧。
+ 支持跨网视频预览。
+ 支持 Docker, Docker Compose, Kubernetes 部署
## 开源库
感谢 @panjjo 大佬的开源库 [panjjo/gosip](https://github.com/panjjo/gosip),GoWVP 的 sip 信令基于此库,出于底层封装需要,并非直接依赖该项目,而是源代码放到了 pkg 包中。
流媒体服务支持三种
+ @夏楚 [ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit)
+ lalmax 已支持 zlm 接口,[lalmax](https://github.com/q191201771/lalmax)
+ **[lalmax-pro/streamsvr](./docs/streamsvr_product_intro_zh.md) 有 golang 企业级流媒体的需求请联系微信 [joestar2006](https://github.com/joestarzxh)(备注留言gowvp)**
- 对环境没有要求,不需要安装任何静态库,支持跨平台编译
- 支持特色功能定制
- 支持 G711(G711A/G711U) 转 AAC
- 支持 AAC 转 opus 音频转码
项目框架基于 @ixugo [goddd](https://github.com/ixugo/goddd)
## QA
> 怎么没有前端资源? 如何加载网页呢?
[点击前往下载 www.zip 压缩包](https://github.com/gowvp/gb28181_web/releases/latest)
前端资源下载(打包)后放到项目根目录,命名为 `www` 即可正常加载。
> 有没有代码相关的学习资料?
[GB/T28181 开源日记[1]:从 0 到实现 GB28181 协议的完整实践](https://juejin.cn/post/7456722441395568651)
[GB/T28181 开源日记[2]:搭建服务端,解决跨域,接口联调](https://juejin.cn/post/7456796962120417314)
[GB/T28181 开源日记[3]:使用 React 组件构建监控数据面板](https://juejin.cn/post/7457228085826764834)
[GB/T28181 开源日记[4]:使用 ESlint 辅助开发](https://juejin.cn/post/7461539078111789108)
[GB/T28181 开源日记[5]:使用 react-hook-form 完成表单](https://juejin.cn/post/7461899974198181922)
[GB/T28181 开源日记[6]:React 快速接入 jessibuca.js 播放器](https://juejin.cn/post/7462229773982351410)
[GB/T28181 开源日记[7]:实现 RTMP 鉴权与播放](https://juejin.cn/post/7463504223177261119)
[GB/T28181 开源日记[8]:国标开发速知速会](https://juejin.cn/post/7468626309699338294)
> 有没有使用资料?
**RTMP**
[RTMP 推拉流规则](https://juejin.cn/post/7463124448540934194)
[如何使用 OBS RTMP 推流到 GB/T28181平台](https://juejin.cn/post/7463350947100786739)
[海康摄像机 RTMP 推流到开源 GB/T28181 平台](https://juejin.cn/post/7468191617020313652)
[大华摄像机 RTMP 推流到开源 GB/T28181 平台](https://juejin.cn/spost/7468194672773021731)
**GB/T28181**
[GB28181 七种注册姿势](https://juejin.cn/post/7465274924899532838)
> 播放黑屏
查看「快捷桌面」 - 「zlm 右上角设置按钮」 - 「国标收流默认地址」
此地址是否能被监控设备访问到
查看「快捷桌面」 - 「zlm 右上角设置按钮」 - 「Hook IP」
zlm 能否访问到 gowvp?? docker 合并版本填写 127.0.0.1 即可,分离部署则要明确的 IP 地址
> 列表项里的通道实际有 n 个,但仅显示部分
设计如此,超过 4 个要在管理页查看,或者点击右侧的 "查看更多"
> 使用了 nginx 反向代理,返回的播放地址无法播放或不加载快照
在反向代理那里配置以下参数,其中域名根据实际的填写
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Prefix "https://gowvp.com";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
> 如何使用其它数据库?
在 configs/config.toml 配置文件中,修改 database.dsn
[推荐] sqlite 应该为本地磁盘路径,建议默认 configs/data.db
[推荐] postgres 参考格式 `postgres://postgres:123456@127.0.0.1:5432/gb28181?sslmode=disable`
mysql 参考格式 `mysql://root:123456@127.0.0.1:5432/gb28181?sslmode=disable`
postgres 和 mysql 的格式即:
`://:@:/?sslmode=disable`
> 如何关闭 AI?
可以在 `configs/config.toml` 中修改 `disabledAI = true` 全局关闭 ai 检测
目前 v1.3.0 版本是 1 秒检测 1 帧,需要播放视频在右上角手动开启.
开启分析后,每路流占用约 200MB 内存 2 核
注意:开启 AI 分析后,即使没有人观看,系统也会自动保持视频流不关闭以确保 AI 持续分析。
> 为什么开启 AI 分析后,即是没人观看,流也不会自动停止
ai 分析会拉取一道流,程序会以为有人观看
> 国标设备在线,通道离线?
属于 ipc 的问题,请检查 ipc 后台注册的 平台 sip_id 和 域是否与 gowvp/owl 一致。
> 如何自定义模型?
将自己的模型存放在 configs 目录下,改名为 `owl.onnx` 或 `owl.tflite`
目前对 onnx 支持最友好
> 播放黑屏,日志提示 zlm 连接不上?
程序会自动识别是否容器中,才会主动启动 zlm,支持 docker/containerd/podman 等,如果确实没有拉起来,尝试在 compose 文件设置环境变量 NVR_STREAM=ZLM,重启容器试试。
播放黑屏也可能是 IP 配置有误,容器内 zlm 与 owl 联系用默认 127.0.0.1 即可,收流 IP 必须填写局域网 IP。
> NVR 播放黑屏? 老旧摄像头播放黑屏?
进入「监控」-「管理」,找到对应的设备,选择「编辑」-「下一步」,将收流模式修改为 **UDP**
等待 1 分钟后,重新点击通道播放看看。
> 摄像机注册上了,但是拿不到通道?
1. 进入「监控」-「接入信息」页面
2. 登录摄像机后台,检查 "server id" 是否与 「接入信息」页面的一致,不一致则修改为一致,重新注册即可
## 第三方鉴权
支持将鉴权请求转发到第三方服务,适用于已有统一认证体系的场景(如 SSO、OAuth2、企业内部账号系统等)。
**时序图**

**使用场景**
+ 已有统一登录系统,希望 owl 复用现有会话,无需再次登录
+ 企业内网环境,需要对接 LDAP、CAS、OAuth2 等认证源
+ API 网关层已做鉴权,希望将校验结果透传到 owl
**配置方式**
在 `configs/config.toml` 中设置 `AuthURL` 为你的第三方鉴权服务地址:
```toml
[Server.HTTP]
AuthURL = "https://your-auth-server.com/api/verify"
```
**工作原理**
配置 `AuthURL` 后,所有请求将通过第三方鉴权服务验证权限。GoWVP 会以 POST 方式将原始请求的 Header 和 Body 透传到该地址,第三方服务返回 `200` 表示鉴权通过,其它状态码则鉴权失败,响应内容直接返回给客户端。
> 注意:第三方鉴权服务需要在 10 秒内响应,否则视为超时失败。
## 文档
GoWVP [在线接口文档](https://apifox.com/apidoc/shared-7b67c918-5f72-4f64-b71d-0593d7427b93)
ZLM使用文档 [github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit)
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
看到这里啦,恭喜你发现新项目
点个 star 不迷路
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
## Docker
### 视频指南
[如何构建或运行项目](https://www.bilibili.com/video/BV1QLQeYHEXb)
[如何用 docker compose 部署项目](https://www.bilibili.com/video/BV112QYY3EZX)
[docker hub](https://hub.docker.com/r/gospace/gowvp)
** gowvp & zlmediakit 融合镜像(推荐)**
docker-compose.yml
```yml
services:
gowvp:
# 如果拉不到 docker hub 镜像,也可以尝试
# registry.cn-shanghai.aliyuncs.com/ixugo/homenvr:latest
image: gospace/gowvp:latest
restart: unless-stopped
# network_mode 和 ports 二选一
# network_mode: host
ports:
# gb28181
- 15123:15123 # HTTP:Web 管理 + ONVIF SOAP 服务端
- 3702:3702/udp # ONVIF WS-Discovery 组播发现
- 15060:15060 # gb28181 sip tcp 端口
- 15060:15060/udp # gb28181 sip udp 端口
# zlm
- 1935:1935 # rtmp
- 554:554 # rtsp
# - 8080:80 # http
# - 8443:443 # https
# - 10000:10000 # rtp 单端口收流
- 20000-20100:20000-20100 # gb28181 收流端口
- 20000-20100:20000-20100/udp # gb28181 收流端口udp
volumes:
# 日志目录是 configs/logs
- ./data:/opt/media/bin/configs
# 录像
- ./recordings:/opt/media/bin/configs/recordings
```
另外,gowvp 和 zlm 可以分开部署,在配置文件配置一下连接地址和端口
## 快速开始
如果你是 Go 语言开发者并熟悉 docker,可以下载源代码,本地编程运行。
**前置条件**
+ Golang
+ Docker & Docker Compose
+ Make
**操作流程**
+ 1. 克隆本项目
+ 2. 修改 configs/config.toml 中 `WebHookIP` 为你的局域网 IP
+ 3. 执行 `make build/linux && docker compose up -d`
+ 4. 自动创建了 zlm.conf 文件夹,获取 config.ini 的 api 秘钥,填写到 `configs/config.toml` 的 `Secret`
+ 5. 执行 `docker compose restart`
+ 6. 浏览器访问 `http://localhost:15123`
## 如何参与开发?
1. fork 本项目
2. 编辑器 run/debug 设置配置输出目录为项目根目录
3. 修改,提交 PR,说明修改内容
## 功能特性
- [x] 开箱即用,支持响应式 web 管理
- [x] 支持输出 HTTP_FLV,Websocket_FLV,HLS,WebRTC,RTSP、RTMP 等多种协议流地址
- [x] 支持局域网/互联网/多层 NAT/特殊网络环境部署
- [x] 支持 SQLite 数据库快速部署
- [x] 支持 PostgreSQL/MySQL 数据库
- [x] 服务重启自动离线/自动尝试连接
- [x] GB/T28181
- [x] 设备注册,支持 7 种接入方式
- [x] 支持 UDP 和 TCP 两种国标信令传输模式
- [x] 设备校时
- [x] 支持 PTZ 云台控制
- [x] 支持信息查询
- [x] 设备目录查询
- [x] 设备信息查询
- [x] 设备基础配置查询(例如设备侧填写超时 3 秒,次数 3 次,则 9+x 秒左右收不到心跳认为离线,x 是检测间隔周期)
- [x] 设备实时直播
- [x] 支持 UDP 和 TCP 被动两种国标流传输模式
- [x] 按需拉流,节省流量 (30秒无人观看自动停止)
- [x] 视频支持播放 H264 和 H265
- [x] 音频支持 g711a/g711u/aac
- [x] 快照
- [x] 支持跨域
- [ ] 卡存录像回放(由 摄像头 录制在SD卡,暂无开发计划)
- [x] 支持 onvif 接入与播放(客户端,发现外部摄像机)
- [x] 支持 onvif 虚拟设备/服务端(向 Home Assistant 等暴露平台通道)
- [x] 支持 rtmp 推流
- [x] 支持 rtsp 拉流
- [x] 支持 ai 算法分析与告警
- [x] 云端录像回放(由 owl 录制)
- [ ] 支持 ONVIF PTZ 云台控制
- [x] 支持中文和 English
- [x] SIP IP 限流,国外攻击特征系统防护,防止云服务被境外 sip 攻击
## ONVIF 虚拟设备(服务端)
GoWVP 可作为 **ONVIF 网络视频发送设备(NVT)**,供 Home Assistant 等系统按 ONVIF 摄像机方式接入,并通过 `GetStreamUri` 获取平台通道对应的 RTSP 地址。
### 端口与防火墙(局域网)
| 用途 | 协议 | 端口 | 是否要开端口 |
| --- | --- | --- | --- |
| Web 管理 + ONVIF SOAP | TCP | `Server.HTTP.Port`(默认 **15123**) | 仅当 HA/NVR 与 GoWVP 跨网段访问时需要;同网段一般不用单独放行 |
| `GetStreamUri` 返回的 RTSP 拉流 | TCP | ZLM RTSP(默认 **554**,见 `docker-compose` 映射) | 客户端从 ZLM 拉流时,跨网段需能访问该端口 |
| ONVIF WS-Discovery(本机对外广播) | UDP | **3702**(组播 `239.255.255.250`) | Docker 需映射 `3702:3702/udp`;同网段一般无需单独防火 |
ONVIF SOAP 路径(与 Web 共用 HTTP 端口):
- `POST http://<主机>:15123/onvif/device_service`
- `POST http://:15123/onvif/media_service`
鉴权使用 `configs/config.toml` 中的 `Server.Username` / `Server.Password`(WS-Security),与 Web 登录默认一致(`admin` / `admin`)。
**Home Assistant 手动添加示例:**
- 主机:`http://<局域网IP>:15123/onvif/device_service`
- 用户名 / 密码:与 `config.toml` 中 `Server.Username`、`Server.Password` 一致
**自动发现:** 启动后在本机 **UDP 3702** 应答 WS-Discovery Probe,HA 可搜索到设备;`configs/config.toml` 中 `Media.IP`(或 `Sip.Host`)会写入 `XAddrs`,宜填局域网 IP。
**说明:** `GET /onvif/discover` 是 GoWVP **扫描局域网内其它 ONVIF 摄像机**(客户端能力),与上述服务端组播发现不是同一功能。
## Webhook 告警事件推送与接收
GoWVP 支持将告警事件通过 HTTP Webhook 推送到外部系统,也支持接收来自其他 GoWVP 实例的告警推送,实现**主从级联**部署。
### 路由
| 方法 | 路径 | 说明 |
|------|------|------|
| `POST` | `/webhook/events` | 统一事件接收入口,兼容 Python AI 和 gowvp 间转发两种来源 |
### 配置(`configs/config.toml`)
```toml
[Server.Webhook]
# 推送目标 URL 数组,secret 直接内嵌于 URL query 参数
Targets = [
"http://192.168.1.100:15123/webhook/events?secret=your-recv-secret",
]
# 最大重试次数,0 = 使用内置默认值 3
MaxRetry = 3
# 每个目标的 channel 缓冲队列大小,0 = 内置默认 64
BufferSize = 64
# 本节点接收 webhook 时校验的密钥(首次启动自动生成并持久化)
RecvSecret = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
```
### 推送 payload 格式(gowvp → gowvp)
```json
{
"did": "device-id",
"cid": "channel-id",
"started_at": "2024-01-01T10:00:00Z",
"ended_at": "2024-01-01T10:00:01Z",
"label": "person",
"score": 0.95,
"zones": "{\"x_min\":0,\"y_min\":0,\"x_max\":100,\"y_max\":100}",
"image_base64": "",
"model": "yolov8"
}
```
> `image_base64`:主节点读取本地图片后 base64 编码随 payload 发送,副节点解码后落盘存储,解决跨节点文件路径失效问题。
> 若图片读取失败,`image_base64` 字段为空,副节点不存图片但事件数据仍会入库。
### 重试策略
推送失败时自动重试,采用**指数退避 + ±25% jitter**:
| 重试次 | 基础延迟 |
|--------|----------|
| 第 1 次 | ~1s |
| 第 2 次 | ~2s |
| 第 3 次 | ~4s(上限 10s)|
HTTP 4xx(除 429/408)视为永久失败,不再重试。每次重试失败记录 warn 日志,耗尽重试次数记录 error 日志。
## 感谢
感谢赞助,排名不分先后。
[@joestarzxh](https://github.com/joestarzxh)
[@oldweipro](https://github.com/oldweipro)
[@beixiaocai](https://github.com/beixiaocai)
[@chencanfggz](https://github.com/chencanfggz)
[@zhangxuan1340](https://github.com/zhangxuan1340)
## 许可证
本项目采用 **[GNU 通用公共许可证 v3.0 (GPL-3.0)](https://www.gnu.org/licenses/gpl-3.0.html)** 授权。
- **您可以自由使用、修改和分发本项目的代码**,但必须遵循以下条件:
- **开源要求**:任何基于本项目的衍生作品(包括修改后的代码或集成本项目的软件)**必须同样以 GPL-3.0 协议开源**。
- **保留协议与版权声明**:在衍生作品中需包含原项目的 `LICENSE` 文件及原始版权声明。
- **明确修改说明**:若您修改了代码,需在文件中注明变更内容。
⚠ **注意**:若将本项目用于商业闭源软件或 SaaS 服务,需遵守 GPL-3.0 的传染性条款(即相关代码必须开源)。
完整许可证文本请见 [LICENSE](./LICENSE) 文件。