docs: 记录播放器同源嵌入修复 (#54)

This commit is contained in:
QiuSW
2026-08-13 15:25:54 +08:00
parent 36964427fc
commit 703148df58
3 changed files with 13 additions and 7 deletions
+3 -3
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Architecture-and-Code-Map
wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Architecture-and-Code-Map.-
wiki_revision: f0459c19263f3701e38c3f5501587c6b9d8c37cf
synchronized_at: 2026-08-13T04:16:00Z
wiki_revision: a92e032c9512f9a3ea80e0867d35a8798e3a4a5d
synchronized_at: 2026-08-13T07:24:06Z
<!-- gitea-wiki-mirror:end -->
# 架构与代码地图
@@ -103,7 +103,7 @@ Sense 后端功能以 `Sense/server/app/sense/` 为根,并通过 `Sense/server
- `device/`:Device 台账、状态、分页和 AES-256-GCM 凭据保险箱;ONVIF 与 RTSP 凭据可分离或显式复用,读取模型只返回两组凭据是否已配置。
- `adapters/onvif/`、`adapters/rtsp/`、`admission/`:获准网卡上的受控发现、手工 ONVIF 接入、Media 服务发现、Basic/Digest 认证、Profile/StreamUri 读取和 RTSP 验证。跨主机 Media 地址固定回用户已授权的 Device Service origin;跨主机 RTSP URI 只替换为授权主机并保留报告端口与路径。接入结果和脱敏 Profile 持久化到 PostgreSQL,重启后可恢复。
- `adapters/mediamtx/`、`media/`:外部 MediaMTX 进程所有权、localhost Control API、媒体期望态与实际态对账;接入验证出可用 Profile 后自动按 Device/Profile 幂等建立并对账媒体路径。
- `liveview/`:绑定当前用户、最长两分钟的单路播放会话;列表投影设备名称、位置、码流名称与用途,只在内部保留 ID,不暴露源 URI 或摄像机秘密。`waiting` 会话立即加载播放器以触发 MediaMTX 按需拉流,会话轮询只读刷新媒体实际状态。
- `liveview/`:绑定当前用户、最长两分钟的单路播放会话;列表投影设备名称、位置、码流名称与用途,只在内部保留 ID,不暴露源 URI 或摄像机秘密。`waiting` 会话立即加载播放器以触发 MediaMTX 按需拉流,会话轮询只读刷新媒体实际状态。播放器包装页仅允许被 Sense 同源页面嵌入(`SAMEORIGIN` 与 `frame-ancestors 'self'`),其他页面继续使用全局 `DENY`。
- `area/`:归一化多边形/方向警戒线、不可变版本、并发版本校验和分辨率变化后的重新校准。
前端在 `Sense/ui/src/{api,views,router/modules,components}/sense/` 使用对应模块;通用页面复用 Element Plus 表单、表格、分页、Dialog、Tag 和应用容器,只为播放器与区域画布新增局部业务组件。项目内 `identity.RecordAudit`、`device.ReadRTSPCredential`、`device.Describe`、`admission.VerifiedProfile`、`media.PlaybackRoute` 和 `area.ExportCurrent` 是窄适配端口,不是跨项目契约。
+3 -2
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Troubleshooting
wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Troubleshooting
wiki_revision: 7e22db66d04b9af794bcd82fab7147c793570011
synchronized_at: 2026-08-13T04:16:00Z
wiki_revision: e526f43f9f1b627202091f07eb3538ceba511662
synchronized_at: 2026-08-13T07:24:06Z
<!-- gitea-wiki-mirror:end -->
# 故障排查
@@ -55,6 +55,7 @@ synchronized_at: 2026-08-13T04:16:00Z
| 接入成功但提示“媒体服务未就绪” / `process_failed` | 接入资料和 Profile 已保存,实时监看路径也已建立;检查仓库外 `SENSE_MEDIAMTX_BINARY`、基础配置和进程退出原因,修复后到视频服务重新对账。达到三次重启上限后需人工处理。 |
| `apply_failed` / `unconverged` | 检查 localhost Control API 是否启用并为 v3;确认媒体路径和外部进程状态。 |
| 实时监看没有设备 | 先在视频接入完成一次检查;系统会自动建立媒体路径。若已接入仍为空,检查接入结果的媒体状态和视频服务对账。 |
| 实时监看提示“127.0.0.1 拒绝了我们的连接请求” | 先确认播放器接口响应头;该接口必须是 `X-Frame-Options: SAMEORIGIN` 且 CSP 包含 `frame-ancestors 'self'`,普通页面仍应为 `DENY`。旧运行包会因全局 `DENY` 阻止同源播放器 iframe,需重新打包并重启 Sense。 |
| 实时监看持续“等待拉流” | `waiting` 会话应立即加载播放器以触发按需拉流。若连接后仍等待,检查 MediaMTX 路径 readers 和源状态;`401 Unauthorized` 表示摄像机拒绝当前 RTSP 凭据,应在设备管理修正凭据后重新执行视频接入,不能把凭据写入日志或地址。 |
| 画面等待、断开或会话过期 | 查看实时监看中的业务设备名和码流状态;会话轮询会只读刷新 MediaMTX 实际状态,无需手工对账。播放会话最长两分钟。 |
| 区域提示需要重新校准 | Profile 分辨率已变化,按新画面重新绘制并发布新版本,不能静默复用旧坐标。 |
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Task-54-修复实时监看按需拉流循环等待
wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Task-54-%E4%BF%AE%E5%A4%8D%E5%AE%9E%E6%97%B6%E7%9B%91%E7%9C%8B%E6%8C%89%E9%9C%80%E6%8B%89%E6%B5%81%E5%BE%AA%E7%8E%AF%E7%AD%89%E5%BE%85.-
wiki_revision: 3b3a0a211aa7ed8209799a09818b7901c290f750
synchronized_at: 2026-08-13T07:01:47Z
wiki_revision: 19729dc49683e0ea30b951ec369ce2409ba52b2b
synchronized_at: 2026-08-13T07:24:36Z
<!-- gitea-wiki-mirror:end -->
# 54 修复实时监看按需拉流循环等待
@@ -25,6 +25,7 @@ MediaMTX 使用按需拉流时,必须先有播放器读取路径才会连接
- 实时监看收到有效播放地址且状态为“等待拉流”或“可播放”时都加载播放器;“等待拉流”保留明确状态提示,同时触发 MediaMTX 按需连接。
- 会话查询通过只读媒体端口刷新控制器状态,把等待状态安全收敛为可播放或需要处理,不重新应用路径配置。
- 播放器包装接口覆盖全局嵌入策略为 `SAMEORIGIN`,并用 CSP `frame-ancestors 'self'` 限制为 Sense 同源页面;其他接口继续保持 `X-Frame-Options: DENY`。
- 继续保持 `sourceOnDemand`,无人观看时不占用摄像机连接与转码资源。
- 真实环境验证过程中发现已保存的 RTSP 凭据被摄像机拒绝(401);已通过现有 Sense 接口使用本地已获授权配置修正运行数据,未把凭据写入仓库、工单、Wiki 或日志证据。
@@ -33,6 +34,7 @@ MediaMTX 使用按需拉流时,必须先有播放器读取路径才会连接
- `Sense/server/app/sense/media/service.go`、`route_port.go`:增加只读状态刷新能力。
- `Sense/server/app/sense/media/service_test.go`:验证刷新状态且不重复配置路径。
- `Sense/server/app/sense/liveview/service.go`:查询会话时刷新媒体状态。
- `Sense/server/app/sense/liveview/http.go`、`http_test.go`:允许并验证播放器包装页仅同源嵌入。
- `Sense/server/app/sense/liveview/service_test.go`:验证等待状态收敛到可播放。
- `Sense/ui/src/components/sense/liveview/StreamPlayer.vue`:等待拉流时即加载播放器。
- Wiki 架构、业务规则与排错页面。
@@ -46,6 +48,7 @@ MediaMTX 使用按需拉流时,必须先有播放器读取路径才会连接
| 实际媒体源可解码 | 通过,探测到 H.264 1920×1080 视频和 AAC 音频 |
| 不重复应用路径配置 | 通过,单元测试验证刷新仅调用状态查询 |
| 不泄露摄像机凭据和源地址 | 通过 |
| 播放器可被 Sense 同源嵌入且其他页面仍禁止嵌入 | 通过,运行包接口响应头验证通过 |
## 测试
@@ -53,6 +56,7 @@ MediaMTX 使用按需拉流时,必须先有播放器读取路径才会连接
- `corepack pnpm lint`:0 error,806 个既有格式 warning。
- `corepack pnpm build`:通过,存在 3 个既有 webpack 体积 warning。
- Go 1.26.5 Windows 打包:通过。
- 运行包响应头:播放器接口为 `SAMEORIGIN` 且包含 `frame-ancestors 'self'`;首页仍为 `DENY`。
- 真实媒体链路:MediaMTX `sourceReady=true`、`readers=1`、收到媒体字节且包含 2 个轨道;Sense 会话由 `waiting` 收敛为 `ready`。
- **未验证部分**:最终浏览器中的可视画面需要用户在当前浏览器验收;自动化已验证媒体源、读取者与会话状态收敛。
@@ -64,3 +68,4 @@ MediaMTX 使用按需拉流时,必须先有播放器读取路径才会连接
- `8d4e4c2` 修复实时监看按需拉流循环等待。
- `b3dfd23` 更新按需拉流长期 Wiki 镜像。
- `3696442` 允许播放器包装页仅被 Sense 同源嵌入。