185 lines
5.5 KiB
Markdown
185 lines
5.5 KiB
Markdown
# WebRTC 音视频通话应用
|
||
|
||
一个基于WebRTC的实时音视频通话web应用,使用WebRTC技术传输视频流。用户开始通话后会自动播放默认视频流,当用户进行音频或文本对话时会切换到相应的视频流,交互结束后自动回到默认视频流。
|
||
|
||
## 功能特性
|
||
|
||
- 🎤 **实时音频通话**: 基于WebRTC技术实现点对点音频通话
|
||
- 📹 **WebRTC视频流传输**: 使用WebRTC技术传输视频流,而非播放本地文件
|
||
- 📐 **固定视频比例**: 视频播放框固定9:16比例,适合移动端显示
|
||
- 🎬 **无播放条界面**: 隐藏视频播放条,提供纯净的观看体验
|
||
- 💬 **文本输入识别**: 根据输入的文本内容切换相应视频流
|
||
- 🎤 **语音输入识别**: 支持语音输入并切换对应视频流
|
||
- 🔄 **自动回退**: 交互结束后自动回到默认视频流
|
||
- 🎨 **现代化UI**: 响应式设计,支持移动端和桌面端
|
||
- 🔄 **实时同步**: 所有用户实时同步视频流状态
|
||
|
||
## WebRTC视频流传输机制
|
||
|
||
1. **视频流创建**: 将本地视频文件转换为MediaStream
|
||
2. **Canvas渲染**: 使用Canvas将视频渲染为实时流
|
||
3. **流切换**: 根据用户交互动态切换不同的视频流
|
||
4. **实时同步**: 所有用户实时同步视频流状态
|
||
5. **缓存机制**: 缓存已创建的视频流,提高切换效率
|
||
6. **多用户传输**: 通过WebRTC技术向所有连接用户传输视频流
|
||
|
||
## 技术栈
|
||
|
||
- **前端**: HTML5, CSS3, JavaScript (ES6+)
|
||
- **后端**: Node.js, Express.js
|
||
- **实时通信**: Socket.IO
|
||
- **音视频**: WebRTC API, Canvas API
|
||
- **视频处理**: MediaStream API
|
||
|
||
## 安装和运行
|
||
|
||
### 前提条件
|
||
|
||
- Node.js (版本 14 或更高)
|
||
- 现代浏览器 (支持WebRTC和Canvas)
|
||
|
||
### 安装依赖
|
||
|
||
```bash
|
||
# 使用npm安装依赖
|
||
npm install
|
||
|
||
# 或使用yarn安装依赖
|
||
yarn install
|
||
```
|
||
|
||
### 启动应用
|
||
|
||
```bash
|
||
# 开发模式(自动重启)
|
||
npm run dev
|
||
|
||
# 或生产模式
|
||
npm start
|
||
```
|
||
|
||
访问 `http://localhost:3000` 开始使用应用。
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
new_rtc/
|
||
├── src/ # 前端源代码
|
||
│ ├── index.html # 主HTML文件
|
||
│ ├── index.js # 主JavaScript文件
|
||
│ └── styles.css # 样式文件
|
||
├── videos/ # 视频文件目录
|
||
│ ├── asd.mp4 # 默认视频文件
|
||
│ ├── zxc.mp4 # 示例视频文件
|
||
│ └── jkl.mp4 # 示例视频文件
|
||
├── server.js # Express服务器
|
||
├── package.json # 项目配置
|
||
└── README.md # 项目说明
|
||
```
|
||
|
||
## 使用说明
|
||
|
||
### 1. 开始音频通话
|
||
|
||
1. 点击"开始音频通话"按钮
|
||
2. 允许浏览器访问麦克风
|
||
3. 音频状态将显示"已连接"
|
||
4. 系统自动开始播放默认视频流(9:16比例,无播放条)
|
||
|
||
### 2. 智能视频流切换
|
||
|
||
1. **WebRTC视频流**: 使用WebRTC技术传输视频流,而非播放本地文件
|
||
2. **固定比例显示**: 视频播放框固定9:16比例,适合移动端观看
|
||
3. **纯净界面**: 隐藏播放条,提供沉浸式观看体验
|
||
4. **文本输入**: 在文本框中输入内容,系统会根据关键词自动切换视频流
|
||
5. **语音输入**: 点击语音按钮进行语音输入,系统会识别并切换视频流
|
||
6. **自动回退**: 交互结束后10秒自动回到默认视频流
|
||
7. **手动控制**: 点击"回到默认视频"按钮立即回到默认视频流
|
||
|
||
### 3. 视频映射配置
|
||
|
||
在 `server.js` 中可以配置文本到视频的映射关系:
|
||
|
||
```javascript
|
||
const videoMapping = {
|
||
'你好': 'asd.mp4',
|
||
'hello': 'asd.mp4',
|
||
'再见': 'zxc.mp4',
|
||
'goodbye': 'zxc.mp4',
|
||
'谢谢': 'jkl.mp4',
|
||
'thank you': 'jkl.mp4',
|
||
'默认': 'asd.mp4'
|
||
};
|
||
```
|
||
|
||
### 4. 默认视频配置
|
||
|
||
在 `server.js` 中可以修改默认视频:
|
||
|
||
```javascript
|
||
const DEFAULT_VIDEO = 'asd.mp4'; // 修改为您的默认视频文件名
|
||
```
|
||
|
||
## 添加新视频
|
||
|
||
1. 将视频文件放入 `videos/` 目录
|
||
2. 支持的格式: MP4, WebM, AVI
|
||
3. 在 `server.js` 中更新视频映射配置
|
||
4. 重启服务器
|
||
|
||
## 语音识别
|
||
|
||
当前版本使用模拟语音识别。要集成真实的语音识别,可以:
|
||
|
||
1. 使用Web Speech API
|
||
2. 集成第三方语音识别服务(如百度、阿里云等)
|
||
3. 修改 `processVoiceInput` 方法中的语音识别逻辑
|
||
|
||
## 浏览器兼容性
|
||
|
||
- Chrome 60+
|
||
- Firefox 55+
|
||
- Safari 11+
|
||
- Edge 79+
|
||
|
||
## 注意事项
|
||
|
||
1. 需要HTTPS环境才能使用麦克风(本地开发除外)
|
||
2. 确保浏览器允许访问麦克风权限
|
||
3. 视频文件应放在 `videos/` 目录中
|
||
4. 建议使用现代浏览器以获得最佳体验
|
||
5. 交互超时时间可在服务器端配置(默认10秒)
|
||
6. 视频流使用Canvas渲染,确保浏览器支持Canvas API
|
||
|
||
## 故障排除
|
||
|
||
### 无法访问麦克风
|
||
- 检查浏览器权限设置
|
||
- 确保使用HTTPS或localhost
|
||
- 检查设备是否被其他应用占用
|
||
|
||
### 视频流无法创建或黑屏
|
||
- 检查视频文件格式是否支持
|
||
- 确认视频文件路径正确
|
||
- 检查浏览器是否支持Canvas API
|
||
- 查看浏览器控制台是否有错误信息
|
||
- 使用"测试视频文件"按钮检查视频文件是否可访问
|
||
- 确保视频文件在 `videos/` 目录中存在
|
||
|
||
### 连接问题
|
||
- 检查网络连接
|
||
- 确认服务器正在运行
|
||
- 检查防火墙设置
|
||
|
||
### CSS样式问题
|
||
- 确保 `src/styles.css` 文件存在
|
||
- 检查浏览器控制台是否有404错误
|
||
- 确认服务器正确配置了静态文件服务
|
||
|
||
## 许可证
|
||
|
||
MIT License
|
||
|
||
## 贡献
|
||
|
||
欢迎提交Issue和Pull Request来改进这个项目。 |