# webrtc_app_h5
**Repository Path**: NativeBase/webrtc_app_h5
## Basic Information
- **Project Name**: webrtc_app_h5
- **Description**: 这是一个基于WebRTC的音视频通话应用,支持Web和移动端之间的相互通话。该项目包含三个部分:服务端、Web客户端和移动端应用。
- **Primary Language**: NodeJS
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2025-04-20
- **Last Updated**: 2025-08-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# WebRTC通话应用
这是一个基于WebRTC的音视频通话应用,支持Web和移动端之间的相互通话。该项目包含三个部分:服务端、Web客户端和移动端应用。
## 功能特点
- 支持一对一和一对多语音、视频通话
- Web端和移动端可以相互通话
- 支持创建和加入房间
- 支持用户在线状态显示
- 支持静音、关闭视频等通话控制
- 支持扬声器切换
- 自动挂断超时未接听的呼叫(1.5分钟)
- 通话质量监控和记录
## 项目结构
- `server/`: Node.js实现的信令服务器和业务逻辑
- `client/`: Web前端H5页面应用
- `VoiceApp/`: React Native实现的移动端应用
### 移动端应用结构
移动端采用模块化设计,将不同功能划分到不同目录中,使代码结构清晰、易于维护。
```
VoiceApp/
├── src/
│ ├── components/ # 组件目录
│ │ ├── index.ts # 组件导出索引
│ │ ├── call/ # 通话相关组件
│ │ │ ├── CallView.tsx # 通话界面组件
│ │ │ └── IncomingCallView.tsx # 来电界面组件
│ │ └── room/ # 房间相关组件
│ │ ├── LoginForm.tsx # 登录表单组件
│ │ └── RoomView.tsx # 房间视图组件
│ ├── hooks/ # 自定义钩子
│ │ ├── useCall.ts # 通话功能钩子
│ │ ├── useCallTimer.ts # 通话计时钩子
│ │ └── useMediaControls.ts # 媒体控制钩子
│ ├── services/ # 服务层
│ │ ├── socket.ts # Socket服务
│ │ └── webrtc.ts # WebRTC服务
│ ├── styles/ # 样式定义
│ │ └── styles.ts # 全局样式
│ ├── types/ # 类型定义
│ │ └── index.ts # 类型导出索引
│ ├── utils/ # 工具函数
│ │ ├── config.ts # 配置信息
│ │ ├── helpers.ts # 辅助函数
│ │ └── permissions.ts # 权限处理
│ └── App.tsx # 应用主组件
```
### 移动端模块职责
#### 1. 组件 (components)
- **call/** - 通话相关组件
- **CallView.tsx** - 通话中界面,展示视频和通话控制按钮
- **IncomingCallView.tsx** - 来电界面,展示接听和拒绝按钮
- **room/** - 房间相关组件
- **LoginForm.tsx** - 登录表单组件,用户输入房间号和用户名
- **RoomView.tsx** - 房间视图组件,展示房间内其他用户和通话功能按钮
#### 2. 钩子 (hooks)
- **useCall.ts** - 包含通话逻辑的自定义钩子,处理发起、接听、拒绝和结束通话等功能
- **useCallTimer.ts** - 通话计时器钩子,处理通话时长计时功能
- **useMediaControls.ts** - 媒体控制钩子,处理麦克风静音、视频开关和扬声器切换等功能
#### 3. 服务 (services)
- **socket.ts** - 封装Socket.IO通信服务,处理信令交换
- **webrtc.ts** - 封装WebRTC核心功能,处理媒体连接和传输
#### 4. 类型 (types)
- **index.ts** - 定义应用中使用的类型,包括User、CallType、各种数据结构等
#### 5. 工具 (utils)
- **config.ts** - 应用配置,包括服务器地址和WebRTC配置
- **helpers.ts** - 辅助函数,如格式化时间等
- **permissions.ts** - 权限处理功能,处理摄像头和麦克风权限请求
#### 6. 样式 (styles)
- **styles.ts** - 全局样式定义,包含应用中所有组件的样式
### 移动端数据流向
1. **用户界面层** (App.tsx) - 协调不同组件的显示和状态
2. **业务逻辑层** (hooks) - 封装业务逻辑和状态管理
3. **服务层** (services) - 提供WebRTC和Socket通信服务
4. **工具层** (utils) - 提供辅助功能和配置
### 移动端主要功能流程
1. **用户登录**
- 用户输入房间号和用户名
- 通过Socket连接到服务器
- 加入指定房间
2. **房间内通信**
- 显示房间内其他用户
- 可以选择发起语音或视频通话
3. **通话流程**
- 发起方创建WebRTC连接,发送提议
- 接收方收到提议,显示来电界面
- 接收方接听后,建立P2P连接
- 双方可以进行语音/视频通话
- 任一方可以结束通话
4. **媒体控制**
- 可以切换麦克风静音状态
- 可以开启/关闭视频
- 可以切换扬声器/听筒模式
### 移动端设计优势
1. **高度模块化** - 各个功能模块独立,降低了代码耦合度
2. **可重用性** - 组件和钩子可以在其他页面或应用中重用
3. **可测试性** - 逻辑与UI分离,便于单元测试
4. **可维护性** - 清晰的代码结构使维护和扩展变得简单
5. **关注点分离** - 每个模块专注于特定功能,符合单一职责原则
## 技术栈
### 服务端
- Node.js + Express
- Socket.IO(WebSocket)
- MySQL数据库
### Web客户端
- HTML5/CSS3/JavaScript
- WebRTC API
- Socket.IO客户端
### 移动端
- React Native 0.72.5
- react-native-webrtc
- Socket.IO客户端
## 数据库设计
系统使用MySQL数据库存储通话记录和质量数据,主要表结构如下:
### 通话记录表 (call_logs)
| 字段名 | 类型 | 描述 |
| --------- | ----------- | ------------------------------- |
| id | INT | 主键,自增 |
| call_id | VARCHAR(50) | 通话唯一标识符 |
| user_id | INT | 用户ID |
| timestamp | TIMESTAMP | 通话时间 |
| room_id | VARCHAR(50) | 房间ID |
| call_type | VARCHAR(10) | 通话类型(audio/video) |
| duration | INT | 通话时长(秒) |
| status | VARCHAR(20) | 状态(missed/rejected/completed) |
### 通话质量记录表 (call_quality)
| 字段名 | 类型 | 描述 |
| ----------- | ----------- | ----------------------- |
| id | INT | 主键,自增 |
| call_id | VARCHAR(50) | 通话ID,关联call_logs表 |
| user_id | INT | 用户ID |
| timestamp | TIMESTAMP | 记录时间 |
| bandwidth | FLOAT | 带宽使用(kbps) |
| latency | FLOAT | 延迟(ms) |
| packet_loss | FLOAT | 丢包率(%) |
| jitter | FLOAT | 抖动(ms) |
| audio_level | FLOAT | 音频电平 |
| frame_rate | INT | 视频帧率 |
| resolution | VARCHAR(20) | 视频分辨率 |
### 房间日志表 (room_logs)
| 字段名 | 类型 | 描述 |
| ----------- | ----------- | ------------------------------------ |
| id | INT | 主键,自增 |
| room_id | VARCHAR(50) | 房间ID |
| user_id | INT | 用户ID |
| action | VARCHAR(20) | 动作(join/leave/create/close) |
| timestamp | TIMESTAMP | 操作时间 |
| client_info | TEXT | 客户端信息(浏览器/设备类型/操作系统) |
## 安装和运行
### 服务端
```bash
# 进入服务端目录
cd server
# 安装依赖
npm install
# 运行服务
npm run dev
```
### Web客户端
```bash
# 进入客户端目录
cd client
# 安装依赖
npm install
# 运行开发服务器
npm start
```
### 移动端应用
```bash
# 进入移动端应用目录
cd VoiceApp
# 安装依赖
npm install
# 安装iOS依赖(仅macOS)
cd ios && pod install && cd ..
# 运行iOS应用(仅macOS)
npm run ios
# 运行Android应用
npm run android
```
## 部署说明
### 服务端部署
服务端推荐使用PM2进行部署和管理:
```bash
# 安装PM2
npm install -g pm2
# 进入服务端目录
cd server
# 安装生产环境依赖
npm install --production
# 使用PM2启动服务
pm2 start app.js --name "webrtc-server"
# 设置开机自启
pm2 startup
pm2 save
```
### Web前端部署
Web前端需要构建后部署到Web服务器:
```bash
# 进入客户端目录
cd client
# 构建生产环境版本
npm run build
```
构建完成后,将生成的`build`目录中的静态文件部署到服务器:
1. **使用Nginx部署(推荐)**:
创建Nginx配置文件:
```nginx
server {
listen 80;
server_name your-domain.com;
root /path/to/web/root; # 静态文件存放路径
index index.html;
location / {
try_files $uri $uri/ /index.html; # 支持SPA路由
}
# WebSocket代理配置
location /socket.io/ {
proxy_pass http://localhost:5000; # 信令服务器地址
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
```
2. **使用Apache部署**:
创建`.htaccess`文件处理SPA路由:
```apache
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
```
配置WebSocket代理:
```apache
ProxyPass /socket.io/ ws://localhost:5000/socket.io/
ProxyPassReverse /socket.io/ ws://localhost:5000/socket.io/
```
3. **HTTPS配置(重要)**:
为确保WebRTC在所有浏览器中正常工作,强烈建议配置HTTPS。可使用Let's Encrypt免费证书:
```bash
# 安装certbot
sudo apt install certbot python3-certbot-nginx
# 获取并配置证书
sudo certbot --nginx -d your-domain.com
```
### 移动端应用部署
移动端应用需要在各自的应用商店发布:
1. **Android应用**:
```bash
cd VoiceApp
cd android
./gradlew assembleRelease
```
生成的APK文件位于`android/app/build/outputs/apk/release/`目录。
2. **iOS应用**:
在Xcode中配置发布证书后,使用Archive功能打包并上传至App Store。
## 移动端权限配置
### Android 权限
在 `android/app/src/main/AndroidManifest.xml` 文件中添加以下权限:
```xml
```
### iOS 权限
在 `ios/VoiceApp/Info.plist` 文件中添加以下描述:
```xml
NSCameraUsageDescription
需要使用摄像头进行视频通话
NSMicrophoneUsageDescription
需要使用麦克风进行语音通话
```
## 服务器配置
请确保将移动应用中的服务器地址配置正确。默认地址在 `VoiceApp/App.tsx` 文件中:
```javascript
// 服务器地址 - 请替换为您的实际服务器IP地址
const SERVER_URL = 'http://192.168.1.188:5000';
```
**注意:** 不能使用 `localhost` 或 `127.0.0.1`,因为这些地址在移动设备上指向设备自身,而不是您的开发服务器。
## 使用流程
1. 启动服务端
2. 启动Web客户端和/或移动端应用
3. 输入房间号和用户名加入房间
4. 选择在线用户发起语音或视频通话
5. 接听方可以接听或拒绝通话
6. 通话过程中可以控制麦克风、摄像头、扬声器等
7. 任一方可以结束通话
## 注意事项
- 确保在使用前安装了所有必要的依赖
- 在生产环境中,应配置HTTPS和TURN服务器,以便在复杂网络环境下使用
- 移动端应用需要麦克风和摄像头权限才能正常使用
- 确保移动设备和Web设备处于同一网络下,或能够相互访问
- 如果在真机上测试,请确保服务器IP地址是可从移动设备访问的
## 开发者
- 更多信息请参考源代码中的注释和文档