SellyCloudSDK_Android_demo/KIWI_DECOUPLING_GUIDE.md

154 lines
4.0 KiB
Markdown
Raw 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.

# Kiwi SDK 解耦使用指南
## 概述
经过重构Kiwi SDK的初始化已经从RTMP推流和播放器中完全解耦现在采用独立的初始化管理器。
## 解耦后的架构
```
KiwiInitializer (独立初始化管理器)
├── 负责Kiwi SDK的生命周期管理
├── 提供初始化状态查询
└── 与业务逻辑完全解耦
RtmpPusher (纯粹的推流器)
├── startPush() - 普通RTMP推流
└── startPushWithKiwi() - 支持Kiwi转换的推流
RtmpPlayer (纯粹的播放器)
├── prepareAsync() - 普通RTMP播放
└── prepareAsyncWithKiwi() - 支持Kiwi转换的播放
```
## 使用方法
### 1. 在Application中初始化Kiwi SDK
```kotlin
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
// 初始化Kiwi SDK异步不阻塞主线程
val appKey = "your_kiwi_app_key"
KiwiInitializer.initialize(appKey) { success ->
if (success) {
Log.d("App", "Kiwi SDK 初始化成功")
} else {
Log.e("App", "Kiwi SDK 初始化失败")
}
}
}
override fun onTerminate() {
super.onTerminate()
// 释放Kiwi资源
KiwiInitializer.release()
}
}
```
### 2. 普通RTMP推流不使用Kiwi
```kotlin
// 创建推流器
val pusher = RtmpPusher(openGlView, context, listener)
// 开始预览
pusher.startPreview()
// 开始推流直接使用RTMP URL
pusher.startPush("rtmp://your-server.com/live/stream123")
```
### 3. 使用Kiwi转换的推流
```kotlin
// 创建推流器
val pusher = RtmpPusher(openGlView, context, listener)
// 开始预览
pusher.startPreview()
// 检查Kiwi是否已初始化
if (KiwiInitializer.isInitialized()) {
// 使用Kiwi转换推流
pusher.startPushWithKiwi(
baseUrl = "rtmp://fallback-server.com/live/stream123",
rsName = "your_rs_name",
streamKey = "optional_stream_key"
)
} else {
// 回退到普通推流
pusher.startPush("rtmp://fallback-server.com/live/stream123")
}
```
### 4. 普通RTMP播放不使用Kiwi
```kotlin
// 创建播放器
val player = RtmpPlayer(context, listener)
// 设置播放视图
player.setSurface(surface)
// 开始播放直接使用RTMP URL
player.prepareAsync("rtmp://your-server.com/live/stream123")
```
### 5. 使用Kiwi转换的播放
```kotlin
// 创建播放器
val player = RtmpPlayer(context, listener)
// 设置播放视图
player.setSurface(surface)
// 检查Kiwi是否已初始化
if (KiwiInitializer.isInitialized()) {
// 使用Kiwi转换播放
player.prepareAsyncWithKiwi(
baseUrl = "rtmp://fallback-server.com/live/stream123",
rsName = "your_rs_name"
)
} else {
// 回退到普通播放
player.prepareAsync("rtmp://fallback-server.com/live/stream123")
}
```
### 6. 检查Kiwi初始化状态
```kotlin
// 检查初始化状态
val isReady = KiwiInitializer.isInitialized()
val isInProgress = KiwiInitializer.isInitializing()
val statusText = KiwiInitializer.getStatusText()
Log.d("Kiwi", "状态: $statusText, 已初始化: $isReady, 初始化中: $isInProgress")
```
## 解耦的优势
1. **职责分离**: Kiwi初始化与推流/播放逻辑完全分离
2. **灵活配置**: 可以独立控制是否使用Kiwi转换
3. **容错性好**: Kiwi初始化失败不影响基本的推流/播放功能
4. **生命周期清晰**: 在Application级别管理Kiwi SDK生命周期
5. **易于测试**: 可以独立测试Kiwi功能和推流/播放功能
## 错误处理
- 如果Kiwi SDK未初始化调用`startPushWithKiwi()`或`prepareAsyncWithKiwi()`会返回错误
- 如果Kiwi转换失败会自动回退到传入的基础URL
- 所有错误都会通过相应的监听器回调通知
## 注意事项
1. Kiwi SDK只需要在Application中初始化一次
2. 整个应用生命周期中Kiwi状态会保持
3. 应用退出时记得调用`KiwiInitializer.release()`释放资源
4. 推流和播放可以独立选择是否使用Kiwi转换