Files
live-stream-app/FEATURES.md
2025-11-16 18:11:30 +08:00

249 lines
7.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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