This commit is contained in:
Kevin
2026-04-28 10:41:48 +08:00
parent 482b016872
commit 15884bd68e
60 changed files with 2092 additions and 1994 deletions

View File

@@ -46,7 +46,7 @@ python3 scripts/demo_client/fake_rtsp_from_file.py --port 18554 \
- 给该服务容器加 `--add-host=host.docker.internal:host-gateway`Docker 20.10+),或
- 直接把 URL 写成宿主在 **docker0/桥接网** 上可达的局域网 IP`192.168.x.x`),保证从容器内 `curl`/`ffprobe` 能通
生产/容器环境请使用 **`OR_SITE_CONFIG_JSON_FILE`** 指向完整站点 JSON`video_rtsp_urls``voice_or_room_bindings`)。**不要**在仅容器可解析的配置里写 `127.0.0.1` 去指宿主机上的 RTSP`127.0.0.1` 在容器内是容器自己)。
生产/容器环境请使用 `**OR_SITE_CONFIG_JSON_FILE`** 指向完整站点 JSON`video_rtsp_urls``voice_or_room_bindings`)。**不要**在仅容器可解析的配置里写 `127.0.0.1` 去指宿主机上的 RTSP`127.0.0.1` 在容器内是容器自己)。
若监控与假 RTSP **都在宿主机同一系统**里直接跑(非容器),则用 `rtsp://127.0.0.1:...` 即可;否则应使用上面「容器连宿主」的写法。
@@ -64,27 +64,30 @@ Demo 页面「调试:两路视频」中可用 **选择视频** / **拖放**
在 §4.1 勾选 **「一键联调」** 后,在「调试」里为**路1/路2**各选一段视频,再点 **开始手术**,浏览器会把两路视频 **multipart 上传到监控 API**`POST /internal/demo/orchestrate-and-start`),由服务进程依次:
1. 落盘两路视频到临时目录
2. 用 Docker 起 MediaMTX、两路 ffmpeg 推 RTSP`fake_rtsp_from_file.py` 等效)
3. 把当前假流的 **video_rtsp_urls** 合并写入 `OR_SITE_CONFIG_JSON_FILE`(保留已有 `voice_or_room_bindings`;与开录/拉流同进程,固定本机回环)
4. 调用与普通开录相同逻辑
1. 落盘两路视频到临时目录
2. 用 Docker 起 MediaMTX、两路 ffmpeg 推 RTSP`fake_rtsp_from_file.py` 等效)
3. 把当前假流的 **video_rtsp_urls** 合并写入 `OR_SITE_CONFIG_JSON_FILE`(保留已有 `voice_or_room_bindings`;与开录/拉流同进程,固定本机回环)
4. 调用与普通开录相同逻辑
**需同时满足**
- `.env``DEMO_ORCHESTRATOR_ENABLED=true`(并重启 API
- 已设置 `OR_SITE_CONFIG_JSON_FILE` 指向**可写**的站点 JSONDocker 中请用 **bind-mount** 到容器内同一路径
- **运行 `main.py` 的进程**能执行本机 `docker``ffmpeg`(与手动跑 `fake_rtsp_from_file` 相同)。**仅将 API 放 Docker、且不挂载** ` /var/run/docker.sock` 时,容器内往往无法为你在宿主机起 MediaMTX此时请继续用手动假流方式。
- **运行 `main.py` 的进程**能执行本机 `docker``ffmpeg`(与手动跑 `fake_rtsp_from_file` 相同)。**仅将 API 放 Docker、且不挂载** `/var/run/docker.sock` 时,容器内往往无法为你在宿主机起 MediaMTX此时请继续用手动假流方式。
由于每次解析都会重新读取 `video_rtsp_url_map()`,覆盖 JSON 后**无需重启**主服务即可被下一次开录用到。
## 运行方式
```bash
# 1) 启动后端(默认 38080CORS 中间件在 settings.demo_cors_enabled=True 时自动挂载。
# 1) 启动后端(默认 38080开发时建议开启热重载(.env: UVICORN_RELOAD=true 与 python main.py 等效),或:
# uv run uvicorn main:app --host 0.0.0.0 --port 38080 --reload
uv run python main.py
# 2) 启动 demo 客户端静态服务(默认 127.0.0.1:38081
# 2) 启动 demo 客户端静态服务(默认 127.0.0.1:38081
python scripts/demo_client/server.py
# 浏览器热重载(需 dev 依赖;会生成本目录 labels.json 供静态托管):
uv run --group dev python scripts/demo_client/server.py --live
# 或指定端口:
python scripts/demo_client/server.py -p 9000 --host 0.0.0.0
@@ -94,6 +97,12 @@ open http://localhost:38081/
页面顶部的「服务端 Base URL」默认是 `http://localhost:38080`;如果后端部署在其他主机/端口,直接改这里即可。
### 与「语音确认」页一致的热重载
- **API**:环境变量 `UVICORN_RELOAD=true``server_reload=true``python -m main` 使用 `app.config.Settings`)。
- **本 Demo**`--live`livereload监视本目录与 `app/resources/consumable_classifier_labels.yaml`)。
- **web/voice-confirmation**`./start_voice_confirmation_web.sh` 或 [web/voice-confirmation/README.md](../../web/voice-confirmation/README.md)。
## 页面包含什么
- `GET /health` 连通性检查
@@ -130,3 +139,4 @@ open http://localhost:38081/
- `DEMO_CORS_ENABLED`(默认 `True`,生产请在 `.env` 里置 `false`
- `DEMO_CORS_ORIGINS`(默认 `*`,可写 `http://my-host:38081,https://or-demo.example.com`