Skip to content

KSYHardwareDecode

xinbaicheng edited this page Jun 20, 2017 · 2 revisions

金山云Android硬解功能优化

金山云Android播放SDK对于硬解做了以下两点优化:

  1. 提供Android硬解白名单功能及相应接口
  2. 硬解失败时自动切换为软解

以上两点优化分别针对以下两个问题:

  1. 机型是否支持硬解
  2. 视频流不符合标准导致硬解码失败,此时会自动切换至软解

其中,硬解白名单需要由用户主动调用方可生效,而硬解失败切换为软解此功能是默认开启,无需主动设置

一. 硬解白名单

硬解白名单只提供了接口用于判断某机型是否支持硬解 H.264/AVC或H.265/HEVC 编码的视频

1. 版本要求

播放SDK版本要求:v2.0.0及以上

2. 基本接口

硬解白名单的核心类KSYHardwareDecodeWhiteList提供了初始化和推荐是否使用硬解的接口,此类是一个单例,具体接口可参见下述代码

// 白名单状态
/**
 * 白名单模块还未初始化
 */
public static final int KSY_STATUS_IDLE
/**
 * 白名单模块在请求金山云的服务器, 属于初始化过程中
 */
public static final int KSY_STATUS_CONNECTING
/**
 * 白名单模块初始化已经完成
 */
public static final int KSY_STATUS_OK
/**
 * 白名单模块请求金山云服务器失败, 此时白名单不可用
 */
public static final int KSY_STATUS_FAIL

// 对外接口
/**
 * Android硬解白名单初始化, 输入参数不可为null, 否则会有 IllegalArgumentException 抛出
 * @param context ApplicationContext
 */
public void init(Context context)

/**
 * 获取当前状态, 当此接口返回值为 KSY_STATUS_OK 时方可调用方法
 * supportHardwareDecodeH264() 与 supportHardwareDecodeH265()
 * @return 当前状态
 */
public int getCurrentStatus()

/**
 * 当前机型是否支持硬解H.264/AVC 编码的视频,状态不为 KSY_STATUS_OK 会抛出 IllegalStateException
 * @return 返回值为true时为支持,反之则否
 */
public boolean supportHardwareDecodeH264()

/**
 * 当前机型是否支持硬解H.265/HEVC 编码的视频,状态不为 KSY_STATUS_OK 会抛出 IllegalStateException
 * @return 返回值为true时为支持,反之则否
 */
public boolean supportHardwareDecodeH265()
3. 使用示例

需要强调的是硬解白名单初始化接口init会发起网络请求,与金山云的服务器通信,建议尽早调用

public class ExampleApplication extends Application
{
    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化硬解白名单
        // 此处只是示例,并不一定需要在Application里调用硬解白名单的初始化接口
        KSYHardwareDecodeWhiteList.getInstance().init(this);
    }
}

// 播放的Activity
public class PlayerActivity extends Activity
{
    KSYTextureView mKsyTextureView;

    @Override
    public void onCreate() {
        super.onCreate();
        
        // ...
        if (KSYHardwareDecodeWhiteList.getInstance().getCurrentStatus() == KSY_STATUS_OK) {
            // 此处需用户根据自身需求做出选择
            // 若用户播放的视频为 H.264/AVC 编码,则硬调用方法 supportHardwareDecodeH264()
            if (KSYHardwareDecodeWhiteList.getInstance().supportHardwareDecodeH264())
                mKsyTextureView.setDecodeMode(KSYDecodeMode.KSY_DECODE_MODE_AUTO);

            // 若用户播放的视频为 H.265/HEVC 编码,则应调用方法 supportHardwareDecodeH265()
            if (KSYHardwareDecodeWhiteList.getInstance().supportHardwareDecodeH265())
                mKsyTextureView.setDecodeMode(KSYDecodeMode.KSY_DECODE_MODE_AUTO);
        }

        mKsyTextureView.prepareAsync();
    }
}

二. 硬解失败切换为软解

当视频流出现不符合编码标准的情况时,可能会导致硬解失败的情况,此时播放SDK会自动切换至软解

Clone this wiki locally