249 lines
7.3 KiB
Markdown
249 lines
7.3 KiB
Markdown
# 直播中台控制系统 - 功能使用说明
|
||
|
||
## 🎯 项目架构
|
||
|
||
### 系统组成
|
||
- **主进程 (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实现高效通信。 |