添加游戏盾代理支持

This commit is contained in:
2026-03-03 18:11:09 +08:00
parent ae4a045451
commit 8e9b816a4e
13 changed files with 517 additions and 105 deletions

View File

@@ -8,16 +8,17 @@ SDK 核心以 `InteractiveRtcEngine` 为中心,通过 `InteractiveRtcEngineEve
## 目录
1. 准备工作
2. 快速开始
3. 基础通话流程
4. 常用功能
5. 屏幕分享
6. 视频帧前后处理
7. 事件回调EventHandler
8. 通话统计
9. Token 机制
10. 常见问题FAQ
1. 准备工作
2. 快速开始
3. 基础通话流程
4. 常用功能
5. 屏幕分享
6. 视频帧前后处理
7. 事件回调EventHandler
8. 通话统计
9. Token 机制
10. 代理地址配置
11. 常见问题FAQ
---
@@ -38,19 +39,40 @@ SDK 核心以 `InteractiveRtcEngine` 为中心,通过 `InteractiveRtcEngineEve
## 快速开始
### 1. 创建引擎
### 1. SDK 初始化
在使用音视频通话功能前,需先初始化 SDK
```kotlin
SellyCloudManager.initialize(
context = applicationContext,
appId = "your-app-id"
)
```
> `initialize` 的 `appId` 参数为权威值。可选传入 `SellyCloudConfig` 配置 `vhost`、`logEnabled` 等,详见推拉流文档。
### 2. 代理地址设置(可选)
若需通过代理(如洋葱盾)连接信令服务器,在创建引擎前设置:
```kotlin
SellyCloudManager.setProxyAddress("http://127.0.0.1:12345")
```
> SDK 内部通过代理地址解析真实信令服务器 IP。不设置则使用直连。详见「代理地址配置」章节。
### 3. 创建引擎
```kotlin
val appId = getString(R.string.signaling_app_id)
val token = getString(R.string.signaling_token).takeIf { it.isNotBlank() }
val kiwiRsName = getString(R.string.signaling_kiwi_rsname).trim()
val rtcEngine = InteractiveRtcEngine.create(
InteractiveRtcEngineConfig(
context = applicationContext,
appId = appId,
defaultToken = token,
kiwiRsName = kiwiRsName
defaultToken = token
)
).apply {
setEventHandler(eventHandler)
@@ -68,9 +90,20 @@ val rtcEngine = InteractiveRtcEngine.create(
}
```
> `InteractiveRtcEngineConfig` 与默认 token 配置见 `example/src/main/java/com/demo/SellyCloudSDK/interactive/InteractiveLiveActivity.kt`。
`InteractiveRtcEngineConfig` 参数说明:
### 2. 设置本地/远端画布
| 参数 | 类型 | 说明 |
| ---- | ---- | ---- |
| `context` | Context | 应用上下文 |
| `appId` | String | 应用 ID |
| `defaultCallType` | CallType | 默认通话类型,默认 ONE_TO_ONE |
| `defaultToken` | String? | 默认 Token |
| `signalingUrlPrefix` | String | 信令 URL 前缀,默认 `ws://` |
| `signalingUrlSuffix` | String | 信令 URL 后缀,默认 `/ws/signaling` |
> 完整 Demo 见 `example/src/main/java/com/demo/SellyCloudSDK/interactive/InteractiveLiveActivity.kt`。
### 4. 设置本地/远端画布
```kotlin
val localRenderer = SurfaceViewRenderer(this)
@@ -82,7 +115,7 @@ val remoteRenderer = SurfaceViewRenderer(this)
rtcEngine.setupRemoteVideo(InteractiveVideoCanvas(remoteRenderer, remoteUserId))
```
### 3. 加入通话
### 5. 加入通话
```kotlin
val options = InteractiveChannelMediaOptions(callType = CallType.ONE_TO_ONE)
@@ -109,23 +142,9 @@ rtcEngine.leaveChannel()
InteractiveRtcEngine.destroy(rtcEngine)
```
### 4. 进阶配置Demo 未覆盖)
### 6. 进阶配置Demo 未覆盖)
#### 4.1 InteractiveRtcEngineConfig 高级字段
```kotlin
val config = InteractiveRtcEngineConfig(
context = applicationContext,
appId = appId,
defaultCallType = CallType.ONE_TO_ONE,
defaultToken = token,
kiwiRsName = kiwiRsName,
signalingUrlPrefix = "https://",
signalingUrlSuffix = "/signaling"
)
```
#### 4.2 InteractiveChannelMediaOptions 订阅控制
#### 6.1 InteractiveChannelMediaOptions 订阅控制
```kotlin
val options = InteractiveChannelMediaOptions(
@@ -135,7 +154,7 @@ val options = InteractiveChannelMediaOptions(
)
```
#### 4.3 InteractiveVideoEncoderConfig 更多参数
#### 6.2 InteractiveVideoEncoderConfig 更多参数
可选项(按需设置):
@@ -150,14 +169,16 @@ val options = InteractiveChannelMediaOptions(
## 基础通话流程
1. 创建 `InteractiveRtcEngine`
2. 设置 `EventHandler`
3. 配置 `InteractiveVideoEncoderConfig`
4. 设置本地画布 `setupLocalVideo`
5. `joinChannel` 加入频道
6. `onUserJoined` 后设置远端画布
7. 通话中进行音视频控制
8. `leaveChannel` 并释放资源
1. 初始化 SDK`SellyCloudManager.initialize`
2. 设置代理地址(可选,`SellyCloudManager.setProxyAddress`
3. 创建 `InteractiveRtcEngine`
4. 设置 `EventHandler`
5. 配置 `InteractiveVideoEncoderConfig`
6. 设置本地画布 `setupLocalVideo`
7. `joinChannel` 加入频道
8. `onUserJoined` 后设置远端画布
9. 通话中进行音视频控制
10. `leaveChannel` 并释放资源
---
@@ -260,7 +281,7 @@ rtcEngine.setRenderVideoFrameInterceptor { frame, userId ->
}
```
> Demo 中的美颜示例见:
> Demo 中的美颜示例见:
> `example/src/main/java/com/demo/SellyCloudSDK/beauty/FuVideoFrameInterceptor.kt`
---
@@ -321,6 +342,61 @@ rtcEngine.renewToken(newToken, expiresAtSec)
---
## 代理地址配置
SDK 支持通过外部代理(如洋葱盾等安全加速服务)连接信令服务器。代理地址由业务方在 SDK 外部获取,然后注入 SDK。
### 设置方式
```kotlin
// 设置代理地址(在 joinChannel 之前)
SellyCloudManager.setProxyAddress("http://127.0.0.1:12345")
// 清除代理(恢复直连)
SellyCloudManager.setProxyAddress(null)
// 查询当前代理地址
val proxy = SellyCloudManager.getProxyAddress() // null 表示未设置
```
### 格式要求
- 必须以 `http://``https://` 开头
-`null` 或空字符串表示清除代理
- 格式不合法时抛出 `IllegalArgumentException`
### 生效范围
设置后SDK 内部通过代理地址解析真实信令服务器 IP对上层接口透明。
### 时机要求
- 必须在 `joinChannel()` **之前** 设置
- 通话过程中修改代理地址,需 `leaveChannel` 后重新 `joinChannel` 才能生效
### Demo 中的接入示例
Demo 使用 `KiwiHelper` 封装洋葱盾的初始化与代理获取,采用三阶段模式:
```kotlin
// 阶段 1Application.onCreate() 异步初始化
KiwiHelper.initializeAsync()
// 阶段 2Activity 初始化时启动代理获取(非阻塞)
KiwiHelper.startProxySetup(enableKiwi = true, rsName = "your-rs-name")
// 阶段 3joinChannel 前确保代理已就绪
lifecycleScope.launch {
KiwiHelper.awaitProxyReady()
rtcEngine.joinChannel(...)
}
```
> `KiwiHelper` 内部通过 `SellyCloudManager.setProxyAddress()` 将代理地址传给 SDK。
> 详见 `example/src/main/java/com/demo/SellyCloudSDK/KiwiHelper.kt`。
---
## 更多 API 速览(含 Demo 未覆盖)
引擎创建与销毁:
@@ -328,6 +404,12 @@ rtcEngine.renewToken(newToken, expiresAtSec)
- `InteractiveRtcEngine.create(config)`:创建引擎
- `InteractiveRtcEngine.destroy(engine)` / `engine.destroy()`:释放引擎
SDK 初始化与代理:
- `SellyCloudManager.initialize(context, appId, config)`:初始化 SDK
- `SellyCloudManager.setProxyAddress(address)`:设置代理地址
- `SellyCloudManager.getProxyAddress()`:获取当前代理地址
通话控制:
- `setEventHandler(handler)`:设置事件回调
@@ -369,7 +451,11 @@ rtcEngine.renewToken(newToken, expiresAtSec)
1. 检查 `signaling_app_id` 是否正确
2. Token 是否为空或已过期
3. 网络是否受限
4. 若使用代理,检查代理地址是否已正确设置
### Q屏幕分享失败
1. 是否已获取 `MediaProjection` 授权
2. Android 14+ 是否启动前台服务
### Q如何接入代理/加速服务?
SDK 本身不集成任何第三方代理 SDK。业务方需在外部完成代理初始化获取本地代理地址后通过 `SellyCloudManager.setProxyAddress()` 注入。详见「代理地址配置」章节。