133 lines
4.0 KiB
Markdown
133 lines
4.0 KiB
Markdown
|
|
# Android 直播应用问题修复说明
|
|||
|
|
|
|||
|
|
## 问题诊断
|
|||
|
|
|
|||
|
|
### 1. RTMP 地址格式错误 ❌
|
|||
|
|
**问题**:后端返回的 RTMP 地址不完整
|
|||
|
|
- 错误格式:`rtmp://10.0.2.2:1935/live`
|
|||
|
|
- 正确格式:`rtmp://10.0.2.2:1935/live/{streamKey}`
|
|||
|
|
|
|||
|
|
**原因**:`live-streaming/server/utils/streamUrl.js` 中缺少 streamKey
|
|||
|
|
|
|||
|
|
### 2. Android 应用功能误解 ⚠️
|
|||
|
|
**重要**:你的 Android 应用**不支持推流**!
|
|||
|
|
|
|||
|
|
当前应用功能:
|
|||
|
|
- ✅ 创建直播间
|
|||
|
|
- ✅ 查看直播列表
|
|||
|
|
- ✅ 观看直播(播放 HLS/FLV 流)
|
|||
|
|
- ❌ **不能**从 Android 设备推流
|
|||
|
|
|
|||
|
|
正确的使用流程:
|
|||
|
|
1. 在 Android 应用中创建直播间
|
|||
|
|
2. 获取 RTMP 推流地址
|
|||
|
|
3. **在电脑上用 OBS Studio 推流**
|
|||
|
|
4. 在 Android 应用中观看直播
|
|||
|
|
|
|||
|
|
## 已完成的修复 ✅
|
|||
|
|
|
|||
|
|
### 1. 修复后端 RTMP 地址
|
|||
|
|
修改了 `live-streaming/server/utils/streamUrl.js`:
|
|||
|
|
```javascript
|
|||
|
|
// 修复前
|
|||
|
|
rtmp: `rtmp://${host}:${rtmpPort}/live`,
|
|||
|
|
|
|||
|
|
// 修复后
|
|||
|
|
rtmp: `rtmp://${host}:${rtmpPort}/live/${streamKey}`,
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 更新 Android 应用提示
|
|||
|
|
修改了 `MainActivity.java` 中的提示信息,明确说明需要用 OBS 推流。
|
|||
|
|
|
|||
|
|
## 如何使用
|
|||
|
|
|
|||
|
|
### 步骤 1:启动后端服务器
|
|||
|
|
```bash
|
|||
|
|
cd live-streaming
|
|||
|
|
npm start
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
确认服务器运行:
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:3001/health
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 2:重新构建 Android 应用
|
|||
|
|
```bash
|
|||
|
|
cd android-app
|
|||
|
|
gradlew clean assembleDebug
|
|||
|
|
gradlew installDebug
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
或在 Android Studio 中点击 "Run"
|
|||
|
|
|
|||
|
|
### 步骤 3:创建直播间
|
|||
|
|
1. 在 Android 应用中点击"开始直播"
|
|||
|
|
2. 填写直播间标题和主播名称
|
|||
|
|
3. 创建成功后会显示 RTMP 推流地址
|
|||
|
|
|
|||
|
|
### 步骤 4:使用 OBS 推流
|
|||
|
|
1. 打开 OBS Studio
|
|||
|
|
2. 设置 → 推流
|
|||
|
|
3. 服务器:`rtmp://localhost:1935/live/{你的streamKey}`
|
|||
|
|
- 或直接填写应用显示的完整地址
|
|||
|
|
4. 开始推流
|
|||
|
|
|
|||
|
|
### 步骤 5:在 Android 应用中观看
|
|||
|
|
推流成功后,直播间会显示"直播中"状态,点击进入即可观看。
|
|||
|
|
|
|||
|
|
## Android 模拟器网络说明
|
|||
|
|
|
|||
|
|
在 Android 模拟器中:
|
|||
|
|
- `10.0.2.2` = 宿主机的 `localhost`
|
|||
|
|
- `10.0.2.16` = 模拟器自己的 IP
|
|||
|
|
|
|||
|
|
所以:
|
|||
|
|
- Android 应用访问 API:`http://10.0.2.2:3001/api/`
|
|||
|
|
- OBS 推流地址:`rtmp://localhost:1935/live/{streamKey}`
|
|||
|
|
- Android 观看地址:`http://10.0.2.2:8080/live/{streamKey}.flv`
|
|||
|
|
|
|||
|
|
## 常见问题
|
|||
|
|
|
|||
|
|
### Q: 为什么 Android 应用不能直接推流?
|
|||
|
|
A: 从 Android 设备推流需要:
|
|||
|
|
- 摄像头/麦克风权限
|
|||
|
|
- RTMP 推流库(如 librtmp)
|
|||
|
|
- 视频编码处理
|
|||
|
|
- 当前应用没有实现这些功能
|
|||
|
|
|
|||
|
|
### Q: 如果想让 Android 应用支持推流怎么办?
|
|||
|
|
A: 需要添加推流功能,可以使用:
|
|||
|
|
- [yasea](https://github.com/begeekmyfriend/yasea) - Android RTMP 推流库
|
|||
|
|
- [LiveVideoBroadcaster](https://github.com/ant-media/LiveVideoBroadcaster) - Ant Media 的推流方案
|
|||
|
|
|
|||
|
|
### Q: 推流后 Android 应用看不到直播?
|
|||
|
|
A: 检查:
|
|||
|
|
1. OBS 是否成功推流(查看 OBS 状态栏)
|
|||
|
|
2. 后端服务器是否收到推流(查看服务器日志)
|
|||
|
|
3. RTMP 地址和 streamKey 是否正确
|
|||
|
|
4. 防火墙是否阻止了端口 1935 和 8080
|
|||
|
|
|
|||
|
|
### Q: 出现"服务器异常"错误?
|
|||
|
|
A: 可能原因:
|
|||
|
|
1. 后端服务器未启动
|
|||
|
|
2. 网络连接问题
|
|||
|
|
3. API 地址配置错误
|
|||
|
|
4. 查看 Android Studio 的 Logcat 获取详细错误信息
|
|||
|
|
|
|||
|
|
## 防火墙配置
|
|||
|
|
|
|||
|
|
如果遇到连接问题,添加防火墙规则:
|
|||
|
|
```powershell
|
|||
|
|
netsh advfirewall firewall add rule name="Node.js API" dir=in action=allow protocol=TCP localport=3001
|
|||
|
|
netsh advfirewall firewall add rule name="RTMP Server" dir=in action=allow protocol=TCP localport=1935
|
|||
|
|
netsh advfirewall firewall add rule name="HTTP-FLV" dir=in action=allow protocol=TCP localport=8080
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 相关文件
|
|||
|
|
- 后端服务器:`live-streaming/server/index.js`
|
|||
|
|
- RTMP 地址生成:`live-streaming/server/utils/streamUrl.js`
|
|||
|
|
- Android 配置:`android-app/app/build.gradle.kts`
|
|||
|
|
- Android 主界面:`android-app/app/src/main/java/com/example/livestreaming/MainActivity.java`
|
|||
|
|
- Android 直播间:`android-app/app/src/main/java/com/example/livestreaming/RoomDetailActivity.java`
|