# 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转换