Files
live-stream-app/FEATURES.md

249 lines
7.3 KiB
Markdown
Raw Permalink Normal View History

2025-11-16 18:11:30 +08:00
# 直播中台控制系统 - 功能使用说明
## 🎯 项目架构
### 系统组成
- **主进程 (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实现高效通信。