SellyCloudSDK_Android_demo/KIWI_DECOUPLING_GUIDE.md

4.0 KiB
Raw Blame History

Kiwi SDK 解耦使用指南

概述

经过重构Kiwi SDK的初始化已经从RTMP推流和播放器中完全解耦现在采用独立的初始化管理器。

解耦后的架构

KiwiInitializer (独立初始化管理器)
├── 负责Kiwi SDK的生命周期管理
├── 提供初始化状态查询
└── 与业务逻辑完全解耦

RtmpPusher (纯粹的推流器)
├── startPush() - 普通RTMP推流
└── startPushWithKiwi() - 支持Kiwi转换的推流

RtmpPlayer (纯粹的播放器)
├── prepareAsync() - 普通RTMP播放
└── prepareAsyncWithKiwi() - 支持Kiwi转换的播放

使用方法

1. 在Application中初始化Kiwi SDK

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

// 创建推流器
val pusher = RtmpPusher(openGlView, context, listener)

// 开始预览
pusher.startPreview()

// 开始推流直接使用RTMP URL
pusher.startPush("rtmp://your-server.com/live/stream123")

3. 使用Kiwi转换的推流

// 创建推流器
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

// 创建播放器
val player = RtmpPlayer(context, listener)

// 设置播放视图
player.setSurface(surface)

// 开始播放直接使用RTMP URL
player.prepareAsync("rtmp://your-server.com/live/stream123")

5. 使用Kiwi转换的播放

// 创建播放器
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初始化状态

// 检查初始化状态
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转换