# 直播中台控制系统 - 功能使用说明

## 🎯 项目架构

### 系统组成
- **主进程 (Main Process)**: 负责系统管理、数据中心、核心业务逻辑、多窗口协调
- **中控平台 (Renderer)**: 渲染UI、处理用户输入，仅包含轻量级IPC通信代码
- **数字人窗口 (Renderer)**: 渲染数字人界面和iframe，接收主进程数据

### 技术架构
- **桌面端**: Electron 28 + TypeScript
- **前端**: Vue 3 + Composition API + Ant Design Vue
- **状态管理**: Pinia (仅UI状态)
- **通信机制**: IPC (进程间通信)

## 🚀 核心功能实现

### 1. 开始直播
**功能描述**: 完整的直播启动流程
**实现流程**:
1. 从 UserStore 获取用户ID (固定值: 'rs876543')
2. 创建/显示直播窗口
3. 等待页面和iframe加载完成 (30秒超时)
4. 获取数字人平台sessionId
5. 设置直播状态
6. 发送欢迎消息

**前端调用**:
```javascript
// userId 自动从 userStore.user?.userId 获取 (固定值: 'rs876543')
await window.electron.ipcRenderer.invoke('start-live', { userId })
```

**主进程处理**: `[src/main/ipc/live.ts:80-118]`

### 2. 结束直播
**功能描述**: 清理直播资源和状态
**实现流程**:
1. 重置直播状态
2. 关闭直播窗口
3. 清空sessionId
4. 重置所有插播状态

**前端调用**:
```javascript
await window.electron.ipcRenderer.invoke('stop-live')
```

**主进程处理**: `[src/main/ipc/live.ts:124-145]`

### 2.1. 强制关闭
**功能描述**: 强制关闭直播窗口并清理所有资源（紧急情况使用）
**实现流程**:
1. 发送清理指令到直播窗口
2. 强制清理所有媒体资源（摄像头、麦克风、音频、视频状态）
3. 恢复iframe内视频音量到正常状态
4. 强制销毁直播窗口（移除所有监听器）
5. 重置所有直播状态和插播状态
6. 不管当前直播状态，强制执行关闭

**前端调用**:
```javascript
await window.electron.ipcRenderer.invoke('force-close-live')
```

**主进程处理**: `[src/main/ipc/live.ts:147-183]`

### 2.2. 媒体资源清理
**功能描述**: 在强制关闭时彻底清理所有媒体资源
**清理内容**:
- **摄像头资源**: 停止摄像头视频流，清理video元素
- **麦克风资源**: 停止麦克风流，清理audio元素
- **音频资源**: 暂停所有播放中的音频，重置播放状态
- **视频状态**: 恢复iframe内视频音量，清理插播状态
- **应用状态**: 重置所有媒体相关的变量和标志位

**实现细节**:
```javascript
// 主进程发送清理指令
liveState.liveWindow.webContents.send("force-cleanup-media");

// 直播窗口接收并处理
window.electron.ipcRenderer.on('force-cleanup-media', handleForceCleanup);

// 清理函数会执行：
forceCleanupMedia() // 停止所有媒体流、重置状态
```

### 3. 全屏插播
**功能描述**: 切换摄像头全屏显示
**实现方式**: 切换视频插入状态，发送指令到直播窗口

**前端调用**:
```javascript
window.electron.ipcRenderer.send('toggle-camera-insert')
```

**直播窗口响应**: `[src/renderer/src/views/Live/index.vue:92-113]`

### 4. 窗口插播
**功能描述**: 开启摄像头画中画模式
**实现方式**: 在直播窗口右下角显示小窗口摄像头

**前端调用**:
```javascript
window.electron.ipcRenderer.send('insert-camera-video')
```

**直播窗口响应**: `[src/renderer/src/views/Live/index.vue:84-90]`

### 5. 音频插入
**功能描述**: 插入音频文件播放
**实现方式**: 降低主视频音量，播放插入音频

**前端调用**:
```javascript
window.electron.ipcRenderer.send('insert-video-audio')
```

**直播窗口响应**: `[src/renderer/src/views/Live/index.vue:116-147]`

### 6. 镜头切换
**功能描述**: 摄像头开启/关闭切换
**实现方式**: 切换摄像头激活状态

**前端调用**:
```javascript
window.electron.ipcRenderer.send('toggle-camera-insert')
```

### 7. 发送消息到数字人
**功能描述**: 向数字人发送文本内容
**实现流程**:
1. 验证直播状态和sessionId
2. 构建消息参数
3. 调用数字人平台API
4. 处理响应结果

**前端调用**:
```javascript
await window.electron.ipcRenderer.invoke('push-explain-position', '消息内容')
```

**主进程处理**: `[src/main/ipc/live.ts:145-164]`

## 🔄 状态管理

### 主进程状态
```typescript
interface LiveState {
    sessionId: string | null;     // 数字人会话ID
    userId: string | null;        // 用户ID
    isVideoInserted: boolean;     // 视频插入状态
    isLiveOn: boolean;           // 直播状态
    jobList: any[];              // 岗位列表
    currentJob: any;             // 当前岗位
    cameraActive: boolean;       // 摄像头激活状态
    audioActive: boolean;        // 音频激活状态
    liveWindow: BrowserWindow | null; // 直播窗口
}
```

### 状态同步
- **获取直播状态**: `get-live-status` IPC接口
- **UI状态自动同步**: 每2秒从主进程同步状态
- **状态变化实时响应**: 按钮状态根据直播状态动态更新

## 🎮 用户界面

### 中控台布局
- **顶部导航**: 应用标题和用户信息
- **左侧边栏**: 岗位列表和详情信息
- **主内容区**: 直播控制面板、AI模型管理
- **底部输入区**: 消息输入和快捷指令

### 按钮状态管理
- **开始直播**: loading状态，直播中时禁用
- **结束直播**: 仅直播时可用，loading状态
- **插播功能**: 仅直播时可用
- **发送消息**: 仅直播时可用

### 快捷指令
- 欢迎新观众
- 感谢陪伴
- 互动提问
- 行业分享

## 🔗 外部服务集成

### 数字人平台
- **API地址**: `http://ywpt.hx.cn/dmhx/`
- **获取会话**: `get_sessionid` 接口
- **发送消息**: `human` 接口
- **参数格式**: `{ sessionid, text, type: "echo", interrupt: true }`

### 直播展示
- **直播地址**: `https://dmdemo.hx.cn/dashboard.html`
- **参数传递**: `?userId=${userId}`
- **嵌入方式**: iframe 全屏显示

## 🛠️ 开发和调试

### 启动项目
```bash
npm run dev          # 开发模式
npm run build        # 生产构建
npm run typecheck    # 类型检查
```

### 调试接口
```javascript
// 获取主进程实时状态
const state = getLiveState();

// 获取直播状态 (IPC)
const status = await window.electron.ipcRenderer.invoke('get-live-status');
```

### 日志输出
- 主进程日志在Electron控制台查看
- 渲染进程日志在浏览器开发者工具查看
- API调用错误会在控制台详细显示

## 📝 注意事项

### 权限要求
- 摄像头权限: 需要用户授权
- 麦克风权限: 音频插入功能需要
- 网络权限: 访问外部API服务

### 错误处理
- 网络请求失败: 自动重试和错误提示
- 权限被拒绝: 友好的权限请求提示
- 状态不一致: 自动同步机制修复

### 性能优化
- 状态同步频率适中 (2秒)
- IPC通信异步处理
- 资源清理及时 (窗口关闭时)

## 🚀 使用流程

1. **启动应用**: 运行 `npm run dev` 启动开发环境
2. **开始直播**: 点击"开始直播"按钮，系统自动获取sessionId并创建直播窗口
3. **发送消息**: 在输入框输入内容或使用快捷指令，数字人会实时播报
4. **插播控制**: 使用插播功能切换摄像头或插入音频
5. **结束直播**: 点击"结束直播"清理资源

系统已按照现代化架构设计，主进程负责核心逻辑，渲染进程专注于UI展示，通过IPC实现高效通信。