You need to enable JavaScript to run this app.
最新活动
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们
导航

Android

最近更新时间2023.09.22 16:33:17

首次发布时间2022.08.30 16:59:12

美颜特效是直播场景的基础功能,视频直播 SDK 内置了美颜特效(CV SDK)相关接口,帮助您完成美颜特效能力的快速接入。在开始对接前,请先联系商务,获取对应版本的 CV SDK(推荐使用 4.4.3 及以上版本)、授权文件 License 和特效资源包。

本章节为您介绍视频直播 SDK 中提供的美颜滤镜等功能相关接口,您可以参考 veVOS Demo 中直播推流部分的实现,完成 CV SDK 的接入。

接入准备

在开始接入前,您需要联系商务获取:

  • CV SDK(推荐使用 4.2.3 及以上版本);
  • License 授权文件;
  • 特效资源包。

接入说明

Step 1:解压特效资源包

您可使用 SDK 中的 UnzipTask 类将 assets 中的资源包解压到指定目录,也可以自行解压。使用 UnzipTask 解压的示例如下所示。

import com.pandora.ttsdk.effect.common.UnzipTask;

protected void onCreate() {
    unzipEffectResource();
}

private void unzipEffectResource() {
    UnzipTask task = new UnzipTask(new UnzipTask.IUnzipViewCallback() {
        @Override
        public Context getContext() {
            return Env.getApplicationContext();
        }

        @Override
        public void onStartTask() {

        }

        @Override
        public void onEndTask(boolean result) {
            if (result) { // true 表示解压成功
                ... // dobusiness
            }
        }
    });
    // 将 assets/effect/resource.zip 解压到外部存储中应用的私有目录下(storage/xx/"$packageName"/files/effect/)
    task.execute("effect" + File.separator  + "resource.zip",
            Env.getApplicationContext().getExternalFilesDir("effect").getAbsolutePath());
}

解压后的特效资源如下图所示。

Step 2:创建实例

创建 mEffectProcessor 变量。构造方法的参数为 LiveEffectResourceProvider 实例,需要您在回调中返回各种资源的路径。

public static String mResourcePath = Env.getApplicationContext().getExternalFilesDir("assets").getAbsolutePath();
public static final String LICENSE_NAME = "ttsdk2********.licbag";

LiveVideoEffectProcessor mEffectProcessor = LiveVideoEffectProcessor.create(new LiveEffectResourceProvider() {
    private String getResourcePath() {
        return mResourcePath  + File.separator  + "resource";
    }

    @Override
    public String getModelPath() {
        return new File(new File(getResourcePath(), "ModelResource.bundle"), "").getAbsolutePath();
    }

    @Override
    public String getComposePath() {
        return new File(new File(getResourcePath(), "ComposeMakeup.bundle"), "ComposeMakeup").getAbsolutePath();
    }

    @Override
    public String getFilterPath() {
        return new File(new File(getResourcePath(), "FilterResource.bundle"), "Filter").getAbsolutePath();
    }

    @Override
    public String getStickerPath() {
        return new File(new File(new File(getResourcePath()), "StickerResource.bundle"), "stickers").getAbsolutePath();
    }

    @Override
    public String getLicensePath() {
        return new File(new File(new File(getResourcePath()), "LicenseBag.bundle"), LICENSE_NAME).getAbsolutePath();
    }
});

Step 3:检查特效资源

参考如下方法检查特效资源是否生效。

  • 返回 false:表示未生效,需要进行资源可用性检查;
  • 返回 true:可执行 Step 4。
if (!mEffectProcessor.valid()) {
    // License 等资源无效,需要更新。
}

Step 4:配置后处理

创建 livecore 时,将 Step 2 中创建的 mEffectProcessor 和 livecore 进行绑定。

VideoProcesser videoProcesser = new VideoProcesser(); // 创建视频后处理实例
videoProcesser.setProcessor(mEffectProcessor); // 将视频后处理器和 mEffectProcessor 绑定
videoProcesser.setEnable(true); // 开启视频后处理

...

// 创建 livecore
LiveCoreBuilder builder = new LiveCoreBuilder();
...
builder.setVideoEffectProcessor(videoProcesser); // 将 livecore 和视频后处理器绑定
...

LiveCoreEngine liveCoreEngine = builder.getLiveCoreEngine();
LiveCore mLiveCore = liveCoreEngine.getLiveCore();

Step 5:设置美颜美型

在 Livecore 采集过程中,设置不同的美颜美型特效。

说明

  • 不同的美颜美型特效之间可组合,例如将瘦脸、磨皮和美白进行组合;
  • 支持通过修改 intensity 参数设置特效强度。数据类型为 float,取值范围为 [0,1],取值越大,强度越大。

public final static String NODE_BEAUTY_LITE = "beauty_Android_lite";
public final static String NODE_RESHAPE_LITE = "reshape_lite";

VideoEffectHandler handler = LiveVideoEffectProcessor.getInstance();
if (handler == null) {
    return;
}
switch (viewId) {
    case R.id.no_select:
        handler.clearBeauty(); // 清空所有美颜美型特效
        break;
    case R.id.effect_whiten:
        handler.setBeauty(NODE_BEAUTY_LITE, "whiten", intensity);
        break;
    case R.id.effect_smooth:
        handler.setBeauty(NODE_BEAUTY_LITE, "smooth", intensity);
        break;
    case R.id.effect_sharp:
        handler.setBeauty(NODE_BEAUTY_LITE, "sharp", intensity);
        break;
    case R.id.effect_overall: // 瘦脸
        handler.setBeauty(NODE_RESHAPE_LITE, "Internal_Deform_Overall", intensity);
        break;
    case R.id.effect_big_eye:
        handler.setBeauty(NODE_RESHAPE_LITE, "Internal_Deform_Eye", intensity);
        break;
    case R.id.effect_zoom_cheekbone:
        handler.setBeauty(NODE_RESHAPE_LITE, "Internal_Deform_Zoom_Cheekbone", intensity);
        break;
    case R.id.effect_nose:
        handler.setBeauty(NODE_RESHAPE_LITE, "Internal_Deform_Nose", intensity);
        break;
    case R.id.effect_zoom_jawbone:
        handler.setBeauty(NODE_RESHAPE_LITE, "Internal_Deform_Zoom_Jawbone", intensity);
        break;
    case R.id.effect_cutface:
        handler.setBeauty(NODE_RESHAPE_LITE, "Internal_Deform_CutFace", intensity);
        break;
    default:
}
  1. 在 Livecore 采集过程中,设置不同的滤镜特效。

说明

支持通过修改 intensity 参数设置特效强度。数据类型为 float,取值范围为 [0,1],取值越大,强度越大。

private void setFilter(int viewId, float intensity) {
    VideoEffectHandler handler = LiveVideoEffectProcessor.getInstance();
    if (handler == null) {
        return;
    }
    switch (viewId) {
        case R.id.no_select:
            handler.setFilter(null, 0); // 删除滤镜特效
            break;
        case R.id.effect_roubai:
            handler.setFilter("Filter_01_38", intensity);
            break;
        case R.id.effect_naiyou:
            handler.setFilter("Filter_02_14", intensity);
            break;
        case R.id.effect_yangqi:
            handler.setFilter("Filter_03_20", intensity);
            break;
        case R.id.effect_jiegeng:
            handler.setFilter("Filter_04_12", intensity);
            break;
        case R.id.effect_luolita:
            handler.setFilter("Filter_05_10", intensity);
            break;
        case R.id.effect_mitao:
            handler.setFilter("Filter_06_03", intensity);
            break;
        case R.id.effect_makalong:
            handler.setFilter("Filter_07_06", intensity);
            break;
        case R.id.effect_paomo:
            handler.setFilter("Filter_08_17", intensity);
            break;
        case R.id.effect_yinghua:
            handler.setFilter("Filter_09_19", intensity);
            break;
        default:
    }
}

Step 7:设置贴纸

在 Livecore 采集过程中,设置不同的贴纸特效。

private void setSticker(int viewId) {
    VideoEffectHandler handler = LiveVideoEffectProcessor.getInstance();
    if (handler == null) {
        return;
    }
    switch (viewId) {
        case R.id.no_select:
            handler.setSticker(null); // 删除贴纸特效
            break;
        case R.id.effect_chitushaonv:
            handler.setSticker("chitushaonv");
            break;
        case R.id.effect_heimaoyanjing:
            handler.setSticker("heimaoyanjing");
            break;
        case R.id.effect_huahua:
            handler.setSticker("huahua");
            break;
        case R.id.effect_huanletu:
            handler.setSticker("huanletuchiluobo");
            break;
        case R.id.effect_shengrikuaile:
            handler.setSticker("shengrikuaile");
            break;
        case R.id.effect_tumaozi:
            handler.setSticker("tumaozi");
            break;
        case R.id.effect_wochaotian:
            handler.setSticker("wochaotian");
            break;
        case R.id.effect_zhaocaimao:
            handler.setSticker("zhaocaimao");
            break;
        case R.id.effect_zhutouzhuer:
            handler.setSticker("zhutouzhuer");
            break;
        case R.id.effect_shengdanxiaomilu:
            handler.setSticker("shengdanxiaomilu");
            break;
        default:
    }
}

Step 8:销毁实例

销毁 mEffectProcessor 实例。

LiveVideoEffectProcessor.destroy();