端上超分功能接入
更新时间:2024-03-28
接入准备
接入端上超分功能,需要使用播放器SDK高级版(也可以单独接入端上超分SDK),并申请高级版License。
功能介绍
在高级版SDK中,提供了端上超分能力,利用端侧推理能力,实现对低分辨率画面的清晰度提升、噪声和块效应去除,适用于视频播放场景和RTC通话场景。
该能力由SRKit组件和VideoProcessor组件提供,请确保这两个组件已集成到你的APP中。
SDK能力如下表所示
能力 | 说明 |
---|---|
支持的超分倍数 | 固定2倍 |
支持的输入分辨率 | 无限制 |
支持的输入-输出格式 | 纹理ID -> 纹理ID 或 Surface -> Surface |
模型策略 | SDK可以根据目标分辨率&帧率和设备性能自动选择合适的模型,保证实时处理帧率。如果设备性能太差或输入分辨率太大,无法达到实时帧率,SDK也可以给出预期的处理帧率,接入方可以自由决定是否应用超分 |
Demo体验
快速开始
- 初始化SRKit组件
SRKit mSrKit = new SRKit();
// 需要传入您申请的高级版证书LicenseID,ID可以在百度云控制台查看
mSrKit.init(mAppContext,"your-license-id", new IVideoProcessor.OnVideoProcessorInitListener() {
@Override
public void onVideoProcessorInited() {
// 超分内核初始化完成的回调
}
});
如果您的Android TargetApi为31及以上,还需要在AndroidManifest.xml中添加如下的配置。
<uses-native-library android:name="libOpenCL.so" android:required="false" />
- 设置输入和输出
SDK支持以纹理作为输入输出,典型场景是配合GLSurfaceView使用,此时使用方式如下
// 设置输入纹理ID, 该ID对应的是原始视频,超分处理后的内容将渲染到指定的输出纹理ID上
mSrKit.prepareWithInputTexId(mInputTex);
// 设置输出纹理ID,该ID对应的是经过超分处理后的视频
mSrKit.setOutputTexId(mOutputTex)
SDK也支持以Surface作为输入输出,典型场景是配合TextureView或SurfaceView使用,可以在onSurfaceCreated回调中进行设置,此时使用方式如下
// 设置目标surface,超分处理后的内容将渲染到此surface上
mSrKit.prepareWithTargetSurface(mSurfaceholder.getSurface());
// 获取输入surface, 将原始画面渲染到此surface上
mMediaPlayer.setSurface(mSrKit.getInputSurface());
注意:SDK仅支持同类型的输入输出,不支持纹理输入、Surface输出这类情况。
- 超分参数设置
// 设置输入视频宽高
mSrKit.setInputSize(mVideoWidth, mVideoHeight);
// 设置渲染输出宽高
mSrKit.setOutputSize(mOutputWidth, mOutputHeight);
// 设置目标帧率和模型选择策略,SDK会依据输入分辨率和目标帧率,自动选择最合适的模型。模型选择策略可以为速度优先或质量优先。
mSrKit.setTargetFps(mTargetFps, ModelManager.STRATEGY_SPEED_FIRST);
- 开始渲染 当以纹理作为输入输出时,通过下面的方式开始渲染,典型场景是在GLSurfaceView的onDrawFrame中调用
// 开始基于输入纹理ID的渲染,调用一次,渲染一帧
mSrKit.drawFrameFromTexId()
当以Surface作为输入输出,通过下面的方式开始渲染,典型场景是随播放器的start调用
// 开始渲染到目标surface
mSrKit.startRenderFromSurface();
- 释放
// 销毁,如果要重新使用,则需要重新init
mSrKit.release();
在播放器SDK Demo中的GLSurfaceRenderView类和BDCloudVideoView类中对上述流程有详细的展示,可以参考。
最佳实践
在调用prepareWithInputTexId或prepareWithTargetSurface之前,可以依据输入分辨率和帧率获取SDK的预期超分处理帧率,可以根据预期结果,再决定是否应用超分,避免设备性能不足或输入分辨率过高导致的渲染卡顿,示例代码如下
float expectFps = mSrKit.probeExpectedFpsForResolution(mVideoWidth, mVideoHeight, mTargetFps, ModelManager.STRATEGY_SPEED_FIRST);
if (expectFps > 0 && expectFps < mTargetFps) {
Log.w(TAG, "disable sr automatically since expect fps " + expectFps + " is too low");
return;
} else {
// 继续进行正常的输入输出设置、参数设置流程
}
接口说明
SRKit类
接口名 | 描述 |
---|---|
void init(Context context, String appID, OnVideoProcessorInitListener onSrCoreInitListener) | 初始化,鉴权失败时会抛出异常onSrCoreInitListener:超分内核初始化完成的回调。因为超分内核会根据输入分辨率动态初始化,所以该回调会在调用startRenderFromSurface()或drawFrameFromTexId()之后才抛出 |
void release() | 销毁。如果要重新使用,则需要重新调用init |
int getState() | 获取SRKit当前状态。返回值为IVideoProcessor.STATE_RELEASED / IVideoProcessor.STATE_INIT / IVideoProcessor.STATE_PREPARED / IVideoProcessor.STATE_STARTED |
void prepareWithInputTexId(int texid) | 设置输入纹理ID, 该ID对应的是未处理的视频,超分处理后的内容将渲染到指定的输出纹理ID上。必须在init之后调用,否则抛出异常。 |
void setOutputTexId(int outputTexId) | 设置输出纹理ID。必须在prepareWithInputTexId之后调用,否则抛出异常。 |
void prepareWithTargetSurface(Surface surface) | 设置目标surface,超分后的内容将渲染到此surface上。必须在init之后调用,否则抛出异常. |
Surface getInputSurface() | 获取输入surface, 将原始画面渲染到此surface上。必须在prepareWithTargetSurface(Surface)之后调用,否则抛出异常。 |
void setInputSize(int inputWidth, int inputHeight) | 输入视频宽高。必须在prepareWithInputTexId或prepareWithTargetSurface之后调用,否则抛出异常。在调用startRenderFromSurface()或drawFrameFromTexId()开始渲染后,不可再扩大inputSize,如果需要扩大,则必须调用release,重新进行初始化。 |
void setOutputSize(int outputWidth, int outputHeight) | 渲染输出宽高。必须在prepareWithInputTexId或prepareWithTargetSurface之后调用,否则抛出异常。 |
void setTargetFps(float fps, @ModelManager.MODEL_STRATEGY int strategy) | 设置目标帧率和模型选择策略,SDK会依据输入分辨率和目标帧率,自动选择最合适的模型。/br<>可选的模型策略包括:ModelManager.STRATEGY_SPEED_FIRST 速度优先ModelManager#STRATEGY_QUALITY_FIRST 质量优先 |
float probeExpectedFpsForResolution(int width, int height, float targetFps, @ModelManager.MODEL_STRATEGY int strategy) | 获取模型在指定分辨率、目标帧率、模型策略下的预估实际帧率,接入方可以根据预估结果决定是否开启超分。如果在当前设备上超分内核从来没有初始化过(收到OnVideoProcessorInitListener回调),那么无法获得全局设备算力情况,返回值为0。 |
void enableProcess(boolean enable) | 是否开启超分处理,默认开启,必须在prepareWithInputTexId或prepareWithTargetSurface之后调用,否则抛出异常。即使不开启超分处理,依然会将画面渲染到指定的纹理或Surface上,只不过渲染结果没有清晰度提升的效果。 |