-
Notifications
You must be signed in to change notification settings - Fork 246
KSYHardwareDecode
xinbaicheng edited this page Jun 20, 2017
·
2 revisions
金山云Android播放SDK对于硬解做了以下两点优化:
- 提供Android硬解白名单功能及相应接口
- 硬解失败时自动切换为软解
以上两点优化分别针对以下两个问题:
- 机型是否支持硬解
- 视频流不符合标准导致硬解码失败,此时会自动切换至软解
其中,硬解白名单
需要由用户主动调用方可生效,而硬解失败切换为软解
此功能是默认开启,无需主动设置
硬解白名单
只提供了接口用于判断某机型是否支持硬解 H.264/AVC或H.265/HEVC 编码的视频
播放SDK版本要求:v2.0.0及以上
硬解白名单的核心类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()
需要强调的是硬解白名单初始化接口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会自动切换至软解