Skip to content

Video_Filter_Inner

buliaoyin edited this page Jun 30, 2017 · 46 revisions

SDK目前最多支持七种内置美颜,开发者可以根据App的实际情况选择为用户提供合适的美颜

软编只在4.4及以上系统支持,4.4以下的系统会fallback到软编兼容模式


内置美颜使用说明

硬编和软编模式下gpu美颜设置

使用内置美颜时,需要将demo assets目录下的资源copy到你的目标工程的assets目录下,否则部分滤镜功能会受限。

有两种方式可以设置:

方式一: 使用ImgTexFilterMgt中的KSY_FILTER_XXX定义,调用接口setFilter(GLRender glRender, int filterIdx)完成。
参考代码如下:

//设置美颜
mStreamer.getImgTexFilterMgt().setFilter(
     mStreamer.getGLRender(), ImgTexFilterMgt.KSY_FILTER_BEAUTY_SOFT);
//关闭美颜
mStreamer.getImgTexFilterMgt().setFilter(mStreamer.getGLRender(),
    ImgTexFilterMgt.KSY_FILTER_BEAUTY_DISABLE);

支持的美颜类型

常量名(KSY_FILTER_*) 名称 效果描述 美颜效果(三星s6) 资源依赖
BEAUTY_DISABLE 禁用美颜 no_beauty
BEAUTY_DENOISE 自然 美白(中)
磨皮(低)
红润(低)
denoise
BEAUTY_SKINWHITEN 白肤 美白(强)
磨皮(中)
红润(低)
skin_whiten
BEAUTY_SOFT 嫩肤 美白(中)
磨皮(中)
红润(强)
beauty_soft
BEAUTY_SOFT_SHARPEN 简单 美白(中)
磨皮(低)
红润(低)
sharpen
BEAUTY_SOFT_EXT 轻度嫩肤 美白(中)
磨皮(中)
红润(中)
soft_ext
BEAUTY_ILLUSION 柔肤 美白(中)
磨皮(中)
红润(低)
illusion
BEAUTY_PRO 粉嫩 美白(中)
磨皮(强)
红润(中)
0_pink.png
0_ruddy2.png
13_nature.png
BEAUTY_SMOOTH 白皙 美白(中)
磨皮(强)
红润(低)
smooth 3_sweety.png

不同美颜,算法复杂度不同,性能消耗不同,以上算法复杂度依此增加 KSYBeautifyProFilter中传入参数(1、2、3、4)区别仅仅在于磨皮,其中1比较柔和,但在较亮的场景下,画面会比较朦胧。3(natural)相对更加清晰,4最清晰。2和4相对1和3,计算更复杂。总体清晰度1<3<2<=4,处理速度(1=3)>(2=4)。

方式二: 创建内置美颜实例,并将实例调用接口setFilter(ImgTexFilter filter)完成。
通过此种方法,可以同时时多个美颜生效,设置方法同自定义美颜的设置方法自定义美颜

注意:使用该方式时,如果要设置回之前的filter,必须重新new出相应的filter对象,而不能复用之前的对象。

参考代码如下:

//设置单个美颜
mStreamer.getImgTexFilterMgt().setFilter(
     new ImgBeautyDenoiseFilter(mStreamer.getGLRender());
//设置多个美颜(自定义美颜和内置美颜均可)
List<ImgTexFilter> groupFilter = new LinkedList<>();
groupFilter.add(new DemoFilter2(mStreamer.getGLRender()));
groupFilter.add(new DemoFilter3(mStreamer.getGLRender()));
groupFilter.add(new DemoFilter4(mStreamer.getGLRender()));
groupFilter.add(new ImgBeautyDenoiseFilter(mStreamer.getGLRender()));
mStreamer.getImgTexFilterMgt().setFilter(groupFilter);

//关闭美颜
mStreamer.getImgTexFilterMgt().setFilter(null);

调节美颜级别:

// 设置美颜类型
ImgFilterBase filter = new ImgBeautyProFilter(mStreamer.getGLRender(), this);
mStreamer.getImgTexFilterMgt().setFilter(filter);
// 设置美颜级别(首先判断是否支持,然后进行设置)
// 设置磨皮级别,范围0-1
if (filter.isGrindRatioSupported()) {
    filter.setGrindRatio(0.6);
}
// 设置美白级别,范围0-1
if (filter.isWhitenRatioSupported()) {
    filter.setWhitenRatio(0.6);
}
// 设置红润级别,一般范围为0-1,BeautyPro为-1.0~1.0
if (filter.isRuddyRatioSupported()) {
    filter.setRuddyRatio(-0.3);
}
美颜type 类名 支持的美颜级别调整
KSY_FILTER_BEAUTY_DENOISE ImgBeautyDenoiseFilter -
KSY_FILTER_BEAUTY_SKINWHITEN ImgBeautySkinWhitenFilter -
KSY_FILTER_BEAUTY_SOFT ImgBeautySoftFilter 磨皮
KSY_FILTER_BEAUTY_ILLUSION ImgBeautyIllusionFilter 磨皮
KSY_FILTER_BEAUTY_SMOOTH ImgBeautySmoothFilter 磨皮 美白 红润
KSY_FILTER_BEAUTY_SOFT_EXT ImgBeautySoftExtFilter -
KSY_FILTER_BEAUTY_SOFT_SHARPEN ImgBeautySoftSharpenFilter -
KSY_FILTER_BEAUTY_PRO ImgBeautyProFilter 磨皮 美白 红润

各个美颜性能对比及效果:(TBD)

注:美颜的设置在推流过程中可动态生效

特效滤镜

特效滤镜需要使用demo中assets目录下的资源文件,使用方法如下:

// 创建风格滤镜
ImgBeautySpecialEffectsFilter effectsFilter = new ImgBeautySpecialEffectsFilter(
    mStreamer.getGLRender(), 
    CameraActivity.this, 
    ImgBeautySpecialEffectsFilter.KSY_SPECIAL_EFFECT_BLUE);
// 设置风格滤镜
mStreamer.getImgTexFilterMgt().setFilter(effectsFilter);

支持的特效滤镜及其所依赖的资源文件:

常量索引 名称及效果 资源依赖
KSY_SPECIAL_EFFECT_FRESHY 小清新 1_freshy.png
KSY_SPECIAL_EFFECT_BEAUTY 青春靓丽 2_beauty.png
KSY_SPECIAL_EFFECT_SWEETY 甜美可人 3_sweety.png
KSY_SPECIAL_EFFECT_SEPIA 怀旧 4_sepia.png
KSY_SPECIAL_EFFECT_BLUE 蓝调 5_blue.png
KSY_SPECIAL_EFFECT_NOSTALGIA 老照片 6_nostalgia.png
KSY_SPECIAL_EFFECT_SAKURA 樱花 7_sakura.png
KSY_SPECIAL_EFFECT_SAKURA_NIGHT 樱花(光线较暗) 8_sakura_night.png
KSY_SPECIAL_EFFECT_RUDDY_NIGHT 红润(光线较暗) 9_ruddy_night.png
KSY_SPECIAL_EFFECT_SUNSHINE_NIGHT 阳光(光线较暗) 10_sunshine_night.png
KSY_SPECIAL_EFFECT_RUDDY 红润 11_ruddy.png
KSY_SPECIAL_EFFECT_SUSHINE 阳光 12_sunshine.png
KSY_SPECIAL_EFFECT_NATURE 自然 13_nature.png

ACV滤镜

SDK从v4.1.2开始支持ACV滤镜,也就是通过输入photoshop的acv文件来实现其中的效果。

使用方式:

ImgBeautyToneCurveFilter acvFilter = new ImgBeautyToneCurveFilter(mStreamer.getGLRender());
acvFilter.setFromCurveFileInputStream(CameraActivity.this.getResources().openRawResource(R.raw.tone_cuver_sample));
mStreamer.getImgTexFilterMgt().setFilter(acvFilter);

软编兼容模式下cpu美颜设置

该模式下只支持简单磨皮的美颜效果
可通过调用接口KSYStreamer的接口setEnableImgBufBeauty开启

美颜滤镜出错时的处理

某些美颜滤镜可能无法运行在一些机型上,此时SDK提供了错误回调,开发者可以在回调中进行相应处理。

可参考demo中的如下处理:

mStreamer.getImgTexFilterMgt().setOnErrorListener(new ImgTexFilterBase.OnErrorListener() {
    @Override
    public void onError(ImgTexFilterBase filter, int errno) {
        Toast.makeText(CameraActivity.this, "当前机型不支持该滤镜",
                Toast.LENGTH_SHORT).show();
        mStreamer.getImgTexFilterMgt().setFilter(mStreamer.getGLRender(),
                ImgTexFilterMgt.KSY_FILTER_BEAUTY_DISABLE);
    }
});

与iOS SDK美颜名称的对应关系

Android iOS
KSY_FILTER_BEAUTY_DENOISE KSYGPUDnoiseFilter
KSY_FILTER_BEAUTY_SOFT KSYGPUBeautifyPlusFilter
KSY_FILTER_BEAUTY_ILLUSION KSYGPUBeautifyExtFilter
KSY_FILTER_BEAUTY_SMOOTH KSYBeautifyFaceFilter
KSY_FILTER_BEAUTY_PRO KSYBeautifyProFilter
Clone this wiki locally