# Go2Rtc
**Repository Path**: giaog/go2-rtc
## Basic Information
- **Project Name**: Go2Rtc
- **Description**: 本项目基于 [AlexxIT/go2rtc](https://github.com/AlexxIT/go2rtc) 进行功能扩展,保留其低延迟、多协议媒体网关能力,并面向视频算法联调、平台接入测试和 ONVIF 设备模拟场景,新增了一套中文可视化控制台。
- **Primary Language**: Go
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-29
- **Last Updated**: 2026-10-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# go2rtc 视频流模拟与 ONVIF 测试平台
本项目基于 [AlexxIT/go2rtc](https://github.com/AlexxIT/go2rtc) 进行功能扩展,保留其低延迟、多协议媒体网关能力,并面向视频算法联调、平台接入测试和 ONVIF 设备模拟场景,新增了一套中文可视化控制台。
通过控制台可以把本地视频、电脑摄像头或上游 RTSP 流统一接入 go2rtc,再以 RTSP、ONVIF、WebRTC、HLS、MP4、MJPEG 等方式对外提供服务。
> 本仓库包含针对业务场景的页面、接口、配置和发布流程改造。上游 go2rtc 的完整协议文档仍可参考 [官方仓库](https://github.com/AlexxIT/go2rtc) 和 [`internal/`](internal/README.md) 下的模块说明。
## 主要增强能力
| 模块 | 能力 |
| -------- | --------------------------------------------- |
| 视频流控制台 | 重构 `simulate.html`,集中展示任务、访问地址、消费者和运行资源 |
| 多种任务来源 | 支持本地文件、电脑摄像头和 RTSP 输入 |
| 文件管理 | 支持后端文件浏览、本地文件上传、进度显示、取消上传和上传目录选择 |
| 任务管理 | 支持新建、编辑、删除、排序、启用、停用和自动状态刷新 |
| 运行监控 | 展示 CPU、内存、Go 协程、运行时间、进程明细和消费者 IP |
| ONVIF 模拟 | 支持设备信息、多个清晰度 Profile、RTSP 地址发布和 WS-Discovery |
| 模拟 PTZ | 支持绝对移动、相对移动、连续移动、停止、Home Position 和预置点 |
| ONVIF 事件 | 支持 PullPoint、Push Notify、事件模板、推送周期和持久订阅 |
| 浏览器扩展 | 提供完整页面式的 Chrome、Edge 和 Firefox 便携控制台,支持多服务端切换 |
| 版本管理 | 使用根目录 `VERSION` 作为唯一版本源,提供版本校验和自动递增工具 |
| 多架构发布 | 提供 PowerShell/Bash 构建脚本,输出多平台二进制和 SHA256 校验文件 |
## 快速开始
### 环境要求
- Go 1.24 或更高版本;
- FFmpeg,可通过系统环境变量找到,或按 [`internal/ffmpeg/README.md`](internal/ffmpeg/README.md) 配置;
- 使用摄像头时,需要允许进程访问本机采集设备;
- 使用 ONVIF 自动发现时,服务端与客户端通常需要位于同一网段。
### 从源码运行
在项目根目录执行:
```shell
go run .
```
go2rtc 默认读取当前目录的 `go2rtc.yaml`,并根据运行系统自动加载对应的视频流配置:
- Linux:`go2rtc_linux.yaml`
- Windows:`go2rtc_windows.yaml`
- macOS:`go2rtc_mac.yaml`
`go2rtc.yaml` 只保存工程配置,例如服务端口、模块、日志和 ONVIF 设备信息;平台文件只保存 FFmpeg、`streams` 和 `simulate` 等视频流配置。也可以明确指定配置文件:
```shell
go run . -config /path/to/go2rtc.yaml -config /path/to/go2rtc_linux.yaml
```
### 构建后运行
```shell
go build -trimpath
```
Windows:
```powershell
.\go2rtc.exe
```
Linux / macOS:
```bash
chmod +x ./go2rtc
./go2rtc
```
### 页面入口
当前仓库示例配置使用以下地址:
| 页面 | 地址 |
| --------------- | ------------------------------------- |
| go2rtc 原生 WebUI | `http://localhost:2984/` |
| 视频流模拟与转发控制台 | `http://localhost:2984/simulate.html` |
当前工程配置使用的端口如下:
| 服务 | 端口 | 说明 |
| --------------------------------------- | -----: | ----------------- |
| HTTP API / WebUI / ONVIF Device Service | `2984` | 页面、接口和 ONVIF 服务入口 |
| RTSP | `9554` | 对外发布 RTSP 视频流 |
| WebRTC | `9555` | WebRTC TCP/UDP 连接 |
如果替换了配置文件,请以其中的 `api.listen`、`rtsp.listen` 和 `webrtc.listen` 为准。未配置时,上游 go2rtc 的默认端口分别为 `1984`、`8554` 和 `8555`。
### 浏览器扩展
仓库提供了无需构建的 [`browser-extension/`](browser-extension/README.md) 形态。加载扩展后,点击浏览器工具栏图标会打开独立的完整控制台页面,不再使用易被授权窗口关闭的小型弹窗。页面支持添加、授权、编辑、删除和切换多个本机或局域网 go2rtc 服务端,查看各服务端健康状态、流状态、启停单路任务,打开现有 Web 控制台和播放器,并复制发布后的 RTSP 流地址。旧版单服务端配置会在首次打开时自动迁移。
扩展沿用 Web 控制台的界面风格,但不在浏览器沙箱中重复实现媒体后端。用户仍需在本机运行 go2rtc,FFmpeg 由 go2rtc 从用户本地环境变量 `PATH` 中调用。浏览器本身不能直接启动任意本地进程;如需由扩展自动拉起 go2rtc 或 FFmpeg,需要额外安装 Native Messaging 本地伴随程序。
## 视频流模拟与转发控制台
控制台页面位于 [`www/simulate.html`](www/simulate.html),主要用于管理模拟摄像机和转发任务。
### 页面概览
- 展示已配置任务数、活跃流、ONVIF 摄像机数量和停用任务数量;
- 汇总本地文件、电脑摄像头、RTSP 输入和消费者数量;
- 展示 go2rtc 与 FFmpeg 进程的 CPU、内存、PID、运行时间和 Go 协程;
- 展示每路流的来源、编码配置、运行状态、消费者和发布地址;
- 支持查看消费者 IP 明细和定位对应任务;
- 支持复制 RTSP、分档 RTSP 和 ONVIF 服务地址;
- 支持按配置顺序、名称和状态排序任务。
### 支持的任务来源
#### 本地文件
可以填写服务端可读取的绝对路径,也可以从浏览器上传本机文件。
- 后端文件浏览器可查看服务端可读取目录;
- 上传过程显示进度、已传大小和实时速度;
- 可以取消正在进行的上传;
- 单文件默认限制为 20 GiB;
- 文件先写入临时文件,上传完成后再原子发布,避免任务读取未完成文件;
- `api.upload_dir` 决定默认上传目录,未配置时使用 `static`;
- Windows 本机访问时可调用原生目录选择器;Linux、macOS、容器和远程访问使用网页目录树。
> 页面中的文件路径是 go2rtc 服务端路径,不是访问页面的客户端路径。容器部署时需要先正确挂载媒体目录。
#### 电脑摄像头
页面通过 `/api/ffmpeg/devices` 检测采集设备,并根据设备能力自动填入推荐分辨率和帧率。Windows 使用 DirectShow,Linux 通常使用 V4L2。
无摄像头的 Linux 服务器或容器会返回空设备列表,这是合法状态,不会阻止本地文件或 RTSP 任务运行。
#### RTSP 输入
可以填写上游 RTSP 地址,并配置认证信息、视频编码、音频处理和码率等参数。任务创建后会由 go2rtc 重新发布,方便测试下游平台、NVR 或算法服务。
### 任务启停与 Linux 只读配置
任务开关会同时更新运行时状态和 `simulate.disabled_streams`:
- 配置文件可写时,启停状态会持久化,服务重启后仍然有效;
- Linux 容器或只读文件系统中,如果配置无法写入,任务仍可在当前进程内临时启停;
- 临时变更时页面会提示“配置文件为只读,本次变更仅在当前服务运行期间生效”;
- 服务重启后,临时状态会恢复为配置文件中的状态。
启停接口必须使用 JSON 请求体:
```http
PUT /api/streams/state?src=demo
Content-Type: application/json
{"enabled": false}
```
如果只发送 `PUT /api/streams/state?src=demo` 而没有 JSON 请求体,接口会返回 `400 Bad Request`。
## 基础配置
工程配置和视频流配置分开保存。下面是 `go2rtc.yaml` 中的工程配置:
```yaml
api:
listen: ":2984"
upload_dir: "static"
config: false
rtsp:
listen: ":9554"
webrtc:
listen: ":9555"
```
在当前系统对应的 `go2rtc_linux.yaml`、`go2rtc_windows.yaml` 或 `go2rtc_mac.yaml` 中配置视频流:
```yaml
ffmpeg:
file: "-re -stream_loop -1 -i {input}"
streams:
demo:
- ffmpeg:/data/demo.mp4#video=h264#audio=aac#input=file
simulate:
streams_enabled: true
onvif_enabled: true
rtsp_enabled: true
disabled_streams: []
onvif_qualities:
demo:
- width: 0
height: 0
- width: 1280
height: 720
```
平台流配置文件不存在时,仍可以在自定义主配置中保留 `streams` 以兼容旧版单文件配置。
`api.config` 控制 Web UI 中 Config 配置页面的显示状态,默认为 `true`;设置为 `false` 时会隐藏导航入口,并关闭 `config.html` 和 `api/config`。
控制台提供三个即时生效并写回配置的发布开关:`streams_enabled` 会停止或恢复全部视频任务,`onvif_enabled` 会控制 ONVIF 接口、发现与事件推送,`rtsp_enabled` 会拒绝新的 RTSP 访问并断开已有 RTSP 会话。重新开启整体推流时,只恢复未列入 `disabled_streams` 的任务。
发布地址示例:
```text
RTSP: rtsp://127.0.0.1:9554/demo
ONVIF: http://127.0.0.1:2984/onvif/device_service
```
ONVIF 客户端会从设备服务中获取流列表和对应 RTSP 地址。RTSP 访问需要跨机器时,请把 `127.0.0.1` 替换为服务端可达 IP 或域名。
## ONVIF 模拟服务
### 设备信息
控制台可以配置模拟摄像机的名称、厂商、型号、固件、序列号、硬件名称、服务端口以及 RTSP 访问认证。保存设备信息后,服务会重启以应用监听端口和发布信息。
```yaml
onvif:
name: "模拟摄像机"
manufacturer: "Example"
model: "Virtual IPC-9000"
firmware: "2.1.0"
serial: "CAM-001"
hardware: "Virtual IPC"
mac: "6C:1F:F7:AA:73:FC"
```
这些信息会用于 `GetDeviceInformation`、`GetScopes`、`GetNetworkInterfaces` 和 WS-Discovery,使第三方 ONVIF 客户端看到一致的设备身份。
### 多清晰度 Profile
每路任务可以配置一个或多个 ONVIF 清晰度档位。`width: 0`、`height: 0` 表示保留原始分辨率,其他档位会作为独立 ONVIF Profile 发布。
```yaml
simulate:
onvif_qualities:
demo:
- width: 0
height: 0
- width: 1920
height: 1080
- width: 1280
height: 720
```
普通 RTSP 地址保持任务本身的编码和码率;ONVIF 客户端选择不同 Profile 时,服务按配置提供对应清晰度地址。
档位还可以单独限制帧率和码率。需要转码的档位默认尝试硬件自动探测(不可用时回退软件,当前自动探测优先覆盖 H.264),同一源和同一档位会复用一个转码进程:
```yaml
simulate:
onvif_qualities:
demo:
- width: 1280
height: 720
fps: 25
bitrate: 2500k
maxrate: 3000k
bufsize: 5000k
codec: h264
hardware: auto
```
其中 `codec` 支持 `h264`、`h265` 等 FFmpeg 编码模板;`hardware` 可填写 `auto`、`vaapi`、`cuda`、`videotoolbox`、`dxva2`、`v4l2m2m` 或 `rkmpp`。不需要转码时应保留原始 Profile,以避免额外的解码和编码开销。
### 模拟 PTZ
PTZ 模拟支持:
- AbsoluteMove、RelativeMove、ContinuousMove 和 Stop;
- SetHomePosition 与 GotoHomePosition;
- 创建、读取、调用和删除预置点;
- 按流配置最大缩放倍数、水平/垂直/缩放速度和 Home Position;
- 在控制台全局启用或停用 PTZ,停用后立即停止相关派生转码以节省资源。
```yaml
simulate:
ptz_enabled: true
ptz:
demo:
max_zoom: 4
pan_speed: 0.6
tilt_speed: 0.6
zoom_speed: 0.5
home:
pan: 0
tilt: 0
zoom: 0
```
### ONVIF 事件
事件服务支持 PullPoint 订阅和主动 Push Notify,包括:
- `CreatePullPointSubscription`、`PullMessages`;
- `Subscribe` 与 HTTP `Notify`;
- `Renew`、`GetStatus`、`SetSynchronizationPoint` 和 `Unsubscribe`;
- Topic 过滤、初始事件 Burst 和周期性事件;
- 中文预设事件模板以及自定义 Topic、数据和 PropertyOperation;
- 持久订阅模式,适合长时间稳定压测。
```yaml
event:
enabled: true
interval: 1m
burst: 10
permanent: true
templates:
- enabled: true
name: 烟雾火焰
topic: tns1:RuleEngine/FlameDetector
startData: ''
endData: ''
startOperation: Changed
endOperation: Deleted
```
页面内置烟雾火焰、区域闯入、越线、区域离开、物品丢失、人脸、人形、车辆、包裹、设备故障、镜头遮挡和设备移动等模板,也支持自定义事件。
更详细的 ONVIF 协议说明见 [`internal/onvif/README.md`](internal/onvif/README.md)。事件接收示例见 [`examples/onvif_event_receiver/`](examples/onvif_event_receiver/README.md)。
## HTTP API
控制台使用的主要接口如下。它们服务于当前页面实现,二次开发时请同时参考代码和 [`internal/api/README.md`](internal/api/README.md)。
| 接口 | 方法 | 用途 |
| ----------------------------- | -------------- | --------------------- |
| `/api/simulate` | GET | 获取控制台元数据、任务配置和实际接口地址 |
| `/api/streams` | GET/PUT/DELETE | 查询、新建、编辑和删除视频流 |
| `/api/streams/state` | GET/PUT | 查询停用列表或启停指定任务 |
| `/api/simulate/files` | GET | 浏览后端文件和目录 |
| `/api/simulate/folder-picker` | POST | 调用可用的原生目录选择器 |
| `/api/simulate/upload` | POST | 上传媒体文件 |
| `/api/ffmpeg/devices` | GET | 获取本机视频/音频采集设备 |
| `/api/simulate/metrics` | GET | 获取 CPU、内存、进程和 Go 运行指标 |
| `/api/simulate/onvif` | GET/PUT | 读取或保存 ONVIF 设备配置 |
| `/api/simulate/ptz` | GET/PUT | 查询或控制模拟 PTZ |
| `/api/simulate/events` | GET/PUT | 读取或保存 ONVIF 事件配置 |
| `/api/restart` | POST | 保存关键配置后重启当前进程 |
如果配置了 `api.base_path`,页面会自动使用带前缀的接口地址,不应在前端硬编码 `/api/...`。
## 版本号管理
根目录 [`VERSION`](VERSION) 是应用版本的唯一来源,格式为 `M.m.p`。构建时版本号会嵌入二进制,发布标签必须使用 `vM.m.p` 并与文件内容完全一致。
### 版本变更规则
- 常规迭代 `regular`:次版本号加一,修订号归零;
- 专项迭代 `special`:修订号加一;
- 重大升级 `major`:主版本号加一,次版本号和修订号归零;
- 次版本号只允许 `0-9`,从 `1.9.x` 开始常规迭代时进位为 `2.0.0`;
- 架构、核心技术栈或 API 出现不兼容变更时,应使用重大升级。
### 版本命令
```shell
# 查看和校验当前版本
go run ./cmd/version show
go run ./cmd/version check
# 预览下一版本,不修改文件
go run ./cmd/version next regular
go run ./cmd/version next special
go run ./cmd/version next major
# 更新 VERSION
go run ./cmd/version bump regular
go run ./cmd/version bump special
go run ./cmd/version bump major
```
GitHub Actions 会在构建二进制和镜像前校验版本格式,并在标签发布时检查标签与 `VERSION` 是否一致。完整规则和发布流程见 [`VERSIONING.md`](VERSIONING.md)。
## 多架构构建
构建脚本位于 [`packaging/`](packaging/README.md),默认使用:
```text
CGO_ENABLED=0
go build -ldflags "-s -w" -trimpath
```
### PowerShell
```powershell
# 构建全部目标
.\packaging\build.ps1
# 构建指定目标
.\packaging\build.ps1 linux-amd64
# 查看支持的目标
.\packaging\build.ps1 -List
```
### Bash
```bash
chmod +x packaging/build.sh
# 构建全部目标
./packaging/build.sh
# 构建指定目标
./packaging/build.sh linux-amd64
# 查看支持的目标
./packaging/build.sh --list
```
当前支持 Windows、Linux、macOS 和 FreeBSD 的常用 AMD64、386、ARM64、ARMv6/ARMv7、MIPSLE 等目标。产物写入 `packaging/dist/`,并生成 `SHA256SUMS.txt`。
详细目标列表、构建前测试和 Linux 二进制诊断方法见:
- [`packaging/README.md`](packaging/README.md)
- [`多架构打包说明.md`](多架构打包说明.md)
## Linux 与 Docker 注意事项
- 如果需要永久保存页面上的工程设置、ONVIF/事件设置、任务启停和流编辑,必须保证 `go2rtc.yaml` 以及当前系统对应的平台流配置文件可写;
- 配置只读时仍可临时启停任务,但重启后恢复配置文件状态;
- 容器内的媒体文件路径必须通过 Volume 映射;
- 摄像头设备需要映射 `/dev/video*` 等设备,并授予相应权限;
- ONVIF WS-Discovery 使用 UDP `3702` 和组播 `239.255.255.250`,Docker 中通常建议使用 host 网络;
- 对外开放 WebUI、文件浏览或上传能力前,应配置 API 认证和网络访问控制;
- RTSP、WebRTC 和 ONVIF 端口需要在防火墙或容器编排中正确放行。
API 认证示例:
```yaml
api:
listen: ":2984"
username: "admin"
password: "change-me"
local_auth: true
upload_dir: "/data/uploads"
```
> 文件浏览可以查看服务进程有权限读取的目录,上传目录选择可以写入用户选中的现有目录。不要把未鉴权的控制台暴露到不可信网络。
## 常见问题
### `/api/ffmpeg/devices` 返回 404
通常表示前端页面与后端二进制版本不匹配,或配置中的 `app.modules` 没有启用 `ffmpeg`。请使用当前源码重新构建,并确认模块列表包含 `api`、`ffmpeg` 和页面所需协议模块。
### `/api/streams/state?src=...` 返回 400
启停请求必须是 `PUT`,并携带 JSON 请求体 `{"enabled": true}` 或 `{"enabled": false}`。直接访问 URL 或使用旧版页面会因为缺少请求体而返回 400。
### Linux 中无法停止视频流任务
当前实现允许在配置只读时进行运行期启停。请确认页面与二进制都来自当前版本。若响应中的 `persisted` 为 `false`,说明停流已经生效,但只持续到服务重启;如需持久化,请为配置文件提供写权限。
### 页面没有检测到摄像头
检查 FFmpeg 是否可执行、系统是否授予设备权限,以及容器是否映射了采集设备。无设备的服务器会正常返回空列表,不属于接口故障。
### ONVIF 客户端搜索不到设备
确认客户端与服务端位于同一网段,放行 UDP 3702 和组播流量。Docker 部署优先使用 host 网络,同时检查客户端是否允许手动添加 `http://:/onvif/device_service`。
## 上游 go2rtc 核心能力
在本项目增强功能之外,仍保留上游 go2rtc 的主要能力:
- RTSP、RTMP、WebRTC、HLS、HTTP、MJPEG、ONVIF、HomeKit 等输入或输出;
- H.264、H.265、MJPEG、AAC、Opus、PCMA、PCMU 等常见视频与音频编码;
- 按需通过 FFmpeg 转码,支持多种软硬件编码器;
- 双向音频、多个来源轨道组合、预加载和流发布;
- WebSocket API、流状态统计和多种网页播放器;
- 可作为独立服务,也可以集成到 Home Assistant 或其他平台。
模块与协议的详细说明:
- [`internal/README.md`](internal/README.md):模块总览
- [`internal/streams/README.md`](internal/streams/README.md):流配置与管理
- [`internal/ffmpeg/README.md`](internal/ffmpeg/README.md):FFmpeg 输入、转码和参数
- [`internal/rtsp/README.md`](internal/rtsp/README.md):RTSP 客户端与服务端
- [`internal/webrtc/README.md`](internal/webrtc/README.md):WebRTC
- [`www/README.md`](www/README.md):原生 WebUI 和前端 API
## 项目结构
```text
.
├── VERSION # 唯一版本号来源
├── VERSIONING.md # 版本规则与发布流程
├── go2rtc.yaml # 工程配置
├── go2rtc_linux.yaml # Linux 视频流配置
├── go2rtc_windows.yaml # Windows 视频流配置
├── go2rtc_mac.yaml # macOS 视频流配置
├── cmd/version/ # 版本管理命令
├── internal/ # go2rtc 核心模块与新增后端接口
├── www/simulate.html # 视频流模拟与转发控制台
├── packaging/ # 多架构构建脚本和说明
├── examples/ # ONVIF 等示例程序
└── website/ # 上游网站资源
```
## 致谢与许可证
本项目建立在 [AlexxIT/go2rtc](https://github.com/AlexxIT/go2rtc) 及其依赖的开源生态之上,感谢上游作者、Pion WebRTC 团队、FFmpeg 社区以及所有贡献者。
许可证见 [`LICENSE`](LICENSE)。使用和分发本项目时,请同时遵守上游项目及相关第三方组件的许可证要求。