Initial commit
This commit is contained in:
153
KIWI_DECOUPLING_GUIDE.md
Normal file
153
KIWI_DECOUPLING_GUIDE.md
Normal file
@@ -0,0 +1,153 @@
|
||||
# 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转换
|
||||
Reference in New Issue
Block a user