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