---
id: v4-1827-ndi-into-ipsource
title: "V4-1827 NDI Source 并入 IP Source 页（radio 三选一互斥）"
doc_type: spec
status: approved
created: 2026-07-21
supersedes: 2026-07-17-v4-1827-ndi-source-webr-redesign-handoff.md (Round 2 独立 NDI 页/单源 tab 方向)
sources:
  - { type: jira, ref: "V4-1827", url: "https://tvunetworks.atlassian.net/browse/V4-1827" }
figma:
  file: rJJjWWs51n2iFOlCIC7aYG
  file_name: "Config-T - Local UI - v7.7 - 8.0"
  key_nodes:
    - { id: "7862:1729", label: "源类型 radio 组件行 WebUI/Form/Item/Radio（改造入口，第三选项 7862:1739 hidden 预留）" }
    - { id: "1011:7877", label: "现有 IP Source 页（6 卡源网格 + Merge All + Type of source radio）" }
    - { id: "1011:8187", label: "现有 IP Source 页（选中态变体）" }
    - { id: "7504:41261", label: "上一版设计尝试（作废）的 NDI 独立页/单源表单——本轮 NDI 字段来源" }
---

# Spec — V4-1827 NDI Source 并入 IP Source 页

> **Jira**: V4-1827 — TVU RPS One to support NDI as Live Input via ETH module · Config-T
> **Figma**: `rJJjWWs51n2iFOlCIC7aYG`（Config-T Local UI）
> **日期**: 2026-07-21 · consumer 无 git repo，落 `TVU Pack/docs/`
> **US 分类**: US-3 迭代既有（同需求）+ Jira 关联 → §M46 就地改，不新建 page

---

## 1. 背景

V4-1827 此前经历两轮方向：Round 1（6 列 Source List 表 + Add External Source 弹窗）、Round 2（每 Transmitter 单源表单，NDI 作为独立顶部 tab）。本轮 owner 再次调整方向：**NDI 归类到 IP Source，不再单列独立页**——在现有 IP Source 页面内，把 HDMI/SDI/USB、IP Source、NDI 三者做成互斥选择（同时只有一个信号输出），共用一个页面、内容区随选择切换。

前两轮方向（独立 tab / 单源表单为独立页，见 §2b）本 spec 取代；但那版 NDI 表单的**字段本身沿用**（Source Name + URL:ndi:// combobox + Apply），作为 IP Source 页内选中 NDI 时的内容区设置项。

## 2. 现状（本需求出现前）

产品当前**尚不支持 NDI Source**——RPS One（Config-T）只有 `HDMI/SDI/USB` 与 `IP Source` 两种源，二选一互斥。前两轮（Round 1 表格、Round 2 独立 NDI tab 单源表单）均为**设计尝试，未落地、不满足需求**，不属于现状（见 §1、§2b）。

**现有 IP Source 页**（`1011:7877` / `1011:8187`）：
- 顶部导航：Encoder / Config for live / MediaMind / Return Video / **IP Source** / VoIP/IFB（**无 NDI tab**）
- 右上 Tx1-4 分页
- `Type of source:` 单选行（`7862:1729`，`WebUI/Form/Item/Radio`）：两个可见选项 `HDMI/SDI/USB`（selected）、`IP Source`；第三个 radio group `7862:1739` 为 hidden 预留占位（尚未启用）
- IP Source 内容区：6 卡源网格（预览 + IP 地址 + To:Transmitter + Apply）+ `Merge All IP Source` 按钮

## 2b. 上一版设计尝试（作废，供参考）

`7504:41261`——这两天设计的一版：独立顶部 tab `NDI Source`（位于 IP Source 右侧）+ per-Transmitter 单源表单（`NDI Source to Transmitter N:` toggle + `Source Name` 输入 + `URL: ndi://` combobox + `Apply`）。经 owner 判定不满足需求，**独立 tab / toggle 框架作废**；其**表单字段**（Source Name + URL:ndi:// combobox + Apply）作为本轮 NDI 内容区的设置项来源（见 §4.3）。

## 3. 需求（owner 决策，已逐条确认）

1. **NDI 归类到 IP Source**：移除独立 `NDI Source` 导航 tab，NDI 并入 IP Source 页。
2. **三者互斥**：`HDMI/SDI/USB` · `IP Source` · `NDI` 同时只能激活一个（一路只输出一个信号）。
3. **切换控件 = radio 单选**：在现有 `7862:1729` radio 行基础上，启用第三个 hidden 预留 group（`7862:1739`）并改造为 `NDI` 选项。（切换控件经多轮探讨——分段控件/二级 tab/下拉/分栏/方块按钮均被 owner 否，最终回到 radio 单选；"框架 OK，控件回归最传统单选"。）
4. **作用域 = per-Transmitter**：每个 Tx 分页各自记忆源类型；切 Tx 分页时 radio 与内容区一并刷新为该路当前配置。
5. **设置项不变，只合并**：三种源各自的设置项与交互行为均维持现状，仅合并到同一页面 + 用 radio 切换内容区。

## 4. 设计方案

### 4.1 页面级
- 移除顶部独立 `NDI Source` tab；导航恢复为 Encoder / Config for live / MediaMind / Return Video / **IP Source** / VoIP/IFB。
- Tx1-4 分页保留在右上不变。

### 4.2 源类型 radio（`7862:1729` 改造）
`Type of source:` 三选一，per-Tx 记忆：

```
                                        [1][2][3][4]   ← Tx 分页

  Type of source:   ○ HDMI/SDI/USB   ● IP Source   ○ NDI
  ────────────────────────────────────────────────────  ← 分隔线（4.4 小优化）
  ▼ 内容区（随「当前 Tx + 选中 radio」切换）
```
- 启用 `7862:1739`（原 hidden、文字为 "IP Source" 的预留 group），改文字为 `NDI`。
- radio 选中/未选样式复用现有 `WebUI/Form/Radio/Selected` · `WebUI/Form/Radio/Unselect`。

### 4.3 三态内容区
| 选中项 | 内容区 | 备注 |
|---|---|---|
| **HDMI/SDI/USB** | 无预览、无设置项。居中一句提示 `Local input active — no configuration required.` | 给提示而非纯空白，避免"页面坏了"观感。 |
| **IP Source** | 现有 6 卡源网格（预览+地址+To:Transmitter+Apply）原样保留 + `Merge All IP Source` 按钮 | Merge 按钮仅此态出现。 |
| **NDI** | 单源表单：`Source Name` 输入 + `URL: ndi://` combobox + `Apply`（沿用 §2b 上一版字段） | 去独立 tab / toggle 框架，见 §4.5。 |

### 4.4 UX 小优化（radio 框架内，纯视觉）
radio 行与内容区之间加一条**分隔线**，明确"下方是所选类型的配置区"的从属关系，让切换时视觉落点更稳，缓解"整块内容突变"的观感。

### 4.5 删除项
- 上一版设计（§2b）NDI 表单顶部的 `NDI Source to Transmitter N:` toggle **不带入本轮**。理由：选中 radio `NDI` 本身即等于"该路启用 NDI"，toggle 语义重复、属冗余，owner 已确认去掉。

## 5. 验收标准
1. IP Source 页 `Type of source:` 显示三个互斥 radio：`HDMI/SDI/USB` · `IP Source` · `NDI`，同一 Tx 下只能选一个。
2. 顶部导航不再有独立 `NDI Source` tab。
3. 选 `HDMI/SDI/USB` → 内容区无预览无设置，仅提示文案。
4. 选 `IP Source` → 6 卡网格 + Merge All 按钮，交互与现状一致。
5. 选 `NDI` → 单源表单（Source Name + URL:ndi:// combobox + Apply），**无** per-Tx toggle。
6. 切 Tx 分页 → radio 与内容区刷新为该路配置（per-Tx 独立记忆）。
7. radio 行与内容区间有分隔线。
8. 机检：componentKey 全部可追溯真实库组件；glyph 零违例；overlap 零碰撞；字体 live 核验仅 Roboto / Noto Sans SC，零 Inter。

## 6. Out of scope / Backlog（本轮不做，如实标注）
- 源类型状态反馈的补充态：发现源空态 / 扫描中 / 发现失败 / 连接中 / Apply 成功·失败 / 超长源名 / 4-Tx 绑定总览。
- NDI combobox 下拉的真实源名清单（owner/域知识，拿到后可程序化批量替换，见 memory）。
- 产品 UI 遗留 Helvetica/Helvetica Neue → DS Roboto 统一（不可移植系统字体，非本轮自发迁移）。

## 7. Open / 待办
- **Jira 状态**：V4-1827 仍需核实 parent / fixVersion / 评论区是否有重复（见 memory `v4-1827-ndi-restart-8.4.md`），本 spec 不含 Jira 写操作，按 slack-jira-write-confirm 先审后发。
- **交付层**：mockup 完成后需同步 PRD / UX 交付卡 / Journey 卡到本方向（三者此前按 Round 2 单源方向写，需按"NDI 并入 IP Source"重写）。
- **REST 机检**：环境无 token，沿用 use_figma in-file 机检替代（同 V4-2259 先例）。
