美摄SDK For HarmonyOS Next  3.14.0
快速接入指南

Effect中间层使用说明


NveEffectKit集成了美颜、美型、美妆、妆容、滤镜、人脸道具功能。依赖库为3.8.0以上的美摄Effect库

导入项目

Android打包为AAR库,复制到libs目录下,在build.gradle设置aar的编译引入

api fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

SDK授权

需要传入授权文件路径,该路径可以是assets下路径,或者本地的绝对路径

String licPath = "assets:/effectsdkdemo.lic";
NveEffectKit.getInstance().init(this, licPath);

初始化人脸检测模型

初始化模型,需传入模型类型和路径(路径可以为assets路径或本地绝对路径)

NveEffectKit.getInstance().initModel(this, NveDetectionModelType.FACE, faceModelPath);
类型 名称 用途
NveDetectionModelType.FACE 人脸 人脸道具使用
NveDetectionModelType.FAKE_FACE 假脸 人脸道具使用
NveDetectionModelType.MAKEUP2 美妆 妆容和单妆使用
NveDetectionModelType.EYEBALL 眼球 部分人脸道具会用到眼球效果
NveDetectionModelType.SEGMENTATION 背景分割 部分人脸道具会用到分割效果
NveDetectionModelType.AVATAR avatar 根据表情动的特效果类别会使用这个模型

美颜使用

//美颜的使用
NveBeauty beauty= new NveBeauty();
beauty.setEnable(true);
//磨皮和美白有多种类型,默认类型如下
beauty.setBlurType(NveBeautyBlurTypeEnum.AdvancedBuffingSkin1);
beauty.setWhiteningType(NveBeautyWhiteningTypeEnum.WhiteningA);
//只设置一次即可,后续修改参数可直接调用beauty的参数set方法。
//开关可以通过enable参数控制
NveEffectKit.getInstance().setBeauty(beauty);
参数 类型 用途
enable boolean 美颜功能开关
blurType NveBeautyBlurTypeEnum 磨皮类型
blurIntensity float 磨皮强度,[0-1]
whiteningType NvBeautyWhiteningTypeEnum 美白类型
whiteningIntensity float 美白强度,[0-1]
matteIntensity float 去油光强度,[0-1]
matteFillRadius float 去油光半径,[0-1]
reddeningIntensity float 红润强度,[0-1]
definitionIntensity float 清晰度强度,[0-1]
sharpnessIntensity float 锐度强度,[0-10]

磨皮类型

名称 用途
NveBeautyBlurTypeEnum.BuffingSkin 普通磨皮
NveBeautyBlurTypeEnum.AdvancedBuffingSkin1 高级磨皮1
NveBeautyBlurTypeEnum.AdvancedBuffingSkin2 高级磨皮2
NveBeautyBlurTypeEnum.AdvancedBuffingSkin3 高级磨皮3

美白类型

名称 用途
NvBeautyWhiteningTypeEnum.WhiteningA 美白A
NvBeautyWhiteningTypeEnum.WhiteningB 美白B

美型使用

//使用美型
NveShape shape= new NveShape();
shape.setEnable(true);
NveEffectKit.getInstance().setShape(shape);
//新增美型,分别传入类型,shapeDegree:美型强度[-1,1],
//shapePackageID:美型包ID(包需要安装,安装见下面安装使用)
shape.setShapeData(NveShapeTypeEnum,new NveShapeData(shapeDegree,shapePackageID));
//修改美型强度
shape.setDegreeByType(NveShapeTypeEnum, value);
名称 用途
NveShapeTypeEnum.FACE_WIDTH 窄脸,[-1,1]
NveShapeTypeEnum.FACE_LENGTH 小脸,[-1,1]
NveShapeTypeEnum.FACE_SIZE 瘦脸,[-1,1]
NveShapeTypeEnum.FORE_HEAD 额头,[-1,1]
NveShapeTypeEnum.CHIN 下巴,[-1,1]
NveShapeTypeEnum.EYE_SIZE 大眼,[-1,1]
NveShapeTypeEnum.EYE_ANGLE 眼角,[-1,1]
NveShapeTypeEnum.NOSE_WIDTH 瘦鼻,[-1,1]
NveShapeTypeEnum.NOSE_LENGTH 长鼻,[-1,1]
NveShapeTypeEnum.MOUTH_SIZE 嘴型,[-1,1]
NveShapeTypeEnum.MOUTH_CORNER 嘴角,[-1,1]

微整形使用

//使用微整形
NveMicroShape microShape = new NveMicroShape();
microShape.setEnable(true);
NveEffectKit.getInstance().setMicroShape(microShape);
//新增微整形,分别传入类型,shapeDegree:微整形强度,
//shapePackageID:微整形ID(包需要安装,安装见下面安装使用)
shape.setMicroShapeData(NveMicroShapeTypeEnum, new NveMicroShapeData(shapeDegree,shapePackageID));
//修改微整形强度
shape.setDegreeByType(NveMicroShapeTypeEnum, value);
名称 用途
NvMicroShapeTypeEnum.HEAD_SIZE 缩头,[-1,1]
NvMicroShapeTypeEnum.CHEEKBONE_WIDTH 颧骨宽,[-1,1]
NvMicroShapeTypeEnum.JAW_WIDTH 下颌宽,[-1,1]
NvMicroShapeTypeEnum.TEMPLE_WIDTH 太阳穴宽,[-1,1]
NvMicroShapeTypeEnum.NASOLABIAL_FOLDS 法令纹,[0,1]
NvMicroShapeTypeEnum.DARK_CIRCLES 黑眼圈,[0,1]
NvMicroShapeTypeEnum.BRIGHTEN_EYES 亮眼,[0,1]
NvMicroShapeTypeEnum.WHITEN_TEETH 美牙,[0,1]
NvMicroShapeTypeEnum.EYE_ANGLE_DEGREE 眼角度,[-1,1]
NvMicroShapeTypeEnum.EYE_DISTANCE 眼离,[-1,1]
NvMicroShapeTypeEnum.EYE_HEIGHT 眼高度,[-1,1]
NvMicroShapeTypeEnum.EYE_WIDTH 眼宽度,[-1,1]
NvMicroShapeTypeEnum.EYE_ARC 眼弧度,[-1,1]
NvMicroShapeTypeEnum.EYE_Y_OFFSET 眼上下,[-1,1]
NvMicroShapeTypeEnum.PHILTRUM 人中,[-1,1]
NvMicroShapeTypeEnum.NOSE_BRIDGE_WIDTH 鼻梁宽度,[-1,1]
NvMicroShapeTypeEnum.NOSE_HEAD 鼻头,[-1,1]
NvMicroShapeTypeEnum.EYEBROW_THICKNESS 眉毛粗细,[-1,1]
NvMicroShapeTypeEnum.EYEBROW_ANGLE 眉角度,[-1,1]
NvMicroShapeTypeEnum.EYEBROW_Y_OFFSET 眉上下,[-1,1]
NvMicroShapeTypeEnum.EYEBROW_X_OFFSET 眉间距,[-1,1]

美摄SDK For Android: 特效名称列表 (meishesdk.com)

美颜、美型、微整形的各个参数均来自于美摄文档仓库中AR Scene的说明,更多进阶用法见上方链接。


美妆

//使用美妆
NveMakeup makeUp= new NveMakeup();
makeUp.setEnable(true);
NveEffectKit.getInstance().setMakeup(makeUp);
//新增美妆中的单妆,NvSingleMakeUp来自单妆包中解析的makeup.json
//(包需要安装,安装见下面安装使用)
makeUp.addSingleMakeUp(NveMakeupTypeEnum, NveSingleMakeUp);
//根据单妆类型删除使用的单妆,每个类型的单妆只能加一个,例如只能加一种类型的口红。
makeUp.removeSingleMakeUp(NveMakeupTypeEnum);
//妆容的使用,NvComposeMakeup来自妆容包中解析的info.json
//(包需要安装,安装见下面安装使用)
makeUp.setComposeMakeup(NveComposeMakeup);
//妆容的删除。妆容是由多个单妆、美颜、美型、微整形、滤镜等组成,每次只能应用一个妆容
makeUp.removeComposeMakeUp();
//调节单妆强度
makeUp.setIntensityByType(NveMakeupTypeEnum.Brighten,1);
//调节单妆颜色
makeUp.setColorByType(NveMakeupTypeEnum.Brighten,new NvsColor(0,0,0,0));
名称 用途
NveMakeupTypeEnum.Lip 口红
NveMakeupTypeEnum.Eyebrow 眉毛
NveMakeupTypeEnum.Eyeshadow 眼影
NveMakeupTypeEnum.Eyelash 睫毛
NveMakeupTypeEnum.Eyeliner 眼线
NveMakeupTypeEnum.Blusher 腮红
NveMakeupTypeEnum.Shadow 修容
NveMakeupTypeEnum.Brighten 高光
NveMakeupTypeEnum.ComposeMakeup 妆容

滤镜

//必传ID,包滤镜需安装,传入安装后的ID(安装见下面安装使用)
NveFilter filter = new NveFilter(effectId);
NveEffectKit.getInstance().addFilter(filter);
//setFilter表示使用滤镜,后续可以进行其他修改参数操作,例如修改强度:
filter.setFilterIntensity(0.5f);
//移除滤镜
NveEffectKit.getInstance().removeFilter(filter);

道具

NveFaceProp faceProp = new NveFaceProp();
faceProp.setEnable(true);
//设置道具Id(道具包需要安装,安装见下面安装使用)
faceProp.setPropId(propId);
NveEffectKit.getInstance().setFaceProp(faceProp);

自定义特效

NveEffectKit除了上述已有功能,用户可自已创建美摄支持的特效,使用中间层来渲染。比如背景分割功能(需提前初始化人脸和分割模型),实现如下:

//创建背景分割
NvsRational aspectRatio = new NvsRational(9, 16);
NvsVideoEffect mSegmentationEffect = NvsEffectSdkContext.getInstance().createVideoEffect("Segmentation Background Fill", aspectRatio);
mSegmentationEffect.setIntVal("Stretch Mode", 2);
mSegmentationEffect.setMenuVal("Segment Type", "Half Body");
mSegmentationEffect.setColorVal("Background Color", new NvsColor(0, 1, 0, 1));
//添加渲染
NveEffectKit.getInstance().addEffect(mSegmentationEffect);
//根据索引添加渲染
NveEffectKit.getInstance().insertEffect(mSegmentationEffect,0);
//移除创建的特效
NveEffectKit.getInstance().removeEffect(mSegmentationEffect);

包安装

上述的内容中基本都涉及包安装,官网有安装说明

美摄SDK For Android: 素材包安装 (meishesdk.com)

可以使用已经封装好的工具类(NvAssetPackageManagerUtil)示例代码:

NveAssetPackageManagerUtil.installFxPackage(packagePath, packageLicPath, packageType);

其中需要重点关注的参数有:

1、packagePath– 安装包的路径,可以为assets路径或者本地绝对路径

2、packageLicPath– 安装包的授权文件路径

3、packageType– 安装包类型,具体类型见:美摄SDK For Android: com.meicam.sdk.NvsAssetPackageManager类 参考 (meishesdk.com)


渲染

1.RenderCore相关初始化
//注:需提前初始化SDK
NveEffectKit.getInstance().initialize();
2.NveRenderInput说明

NveRenderInput主要包括渲染配置(NveRenderConfig),纹理(NveTexture),Buffer(NveImageBuffer),图像的格式(pixelFormat)。具体参数如下:

(1)NveRenderConfig相关参数,包括相机朝向(cameraOrientation)和渲染模式(NveRenderMode)

NveRenderMode 说明
NveRenderConfig.NveRenderMode.TEXTURE_TEXTURE 纹理入,纹理出
NveRenderConfig.NveRenderMode.BUFFER_TEXTURE Buffer入,纹理出
NveRenderConfig.NveRenderMode.BUFFER_BUFFER Buffer入,Buffer出

(2)NveTexture相关参数

参数 说明
textureId 纹理ID
mirror 是否水平翻转,OES纹理转Texture 2D纹理需要
NveSize 纹理宽高
NveTextureType 纹理类型
NveTextureLayout 纹理方向
NveTextureType 说明
NveTextureType.NV_COMMON_TEXTURE 普通纹理
NveTextureType.NV_OES_TEXTURE OpenGL OES纹理
NveTextureLayout 说明
NveTextureLayout.UP_SIDE_DOWN 上下颠倒
NveTextureLayout.DOWN_SIDE_UP 正常

(3)NveImageBuffer相关参数

名称 说明
data Buffer数据
NveSize Buffer宽高
mirror 是否水平翻转
displayRotation 当前图像需要旋转的角度
rowPitchY 图像每行在Frame中占的字节数,如果图像格式是NV21,YUV420, 则指Y平面
rowPitchUV 图像每行在Frame中占的字节数 一般是指UV平面,如果格式为RGBA,这个量没有意义

(4)pixelFormat图像格式,其封装在NvFormatType中,具体对应可参考官网视频帧像素格式

3.NveRenderOutput说明

NveRenderOutput主要包括渲染结果(NveRenderError),输出纹理(NveTexture,参数同上),输出Buffer(NveImageBuffer,参数同上)。其渲染结果参数如下

名称 说明
NveRenderError.NO_ERROR 成功
NveRenderError.ERROR_UNKNOWN 未知错误
NveRenderError.INVALID_TEXTURE 无效的纹理
NveRenderError.INVALID_INPUT_PARAM 无效的输入参数,针对NvRenderInput

4.渲染

//输入配置
NveRenderInput mRenderInput = new NveRenderInput();
mRenderInput.setPixelFormat(NveFormatType.VIDEO_FRAME_PIXEL_FROMAT_NV21.getType());
NveRenderConfig config = new NveRenderConfig()
.setRenderMode(NveRenderConfig.NveRenderMode.TEXTURE_TEXTURE)
.setCameraOrientation(mCameraProxy.getOrientation()).build();
mRenderInput.setConfig(config);
//输入纹理
NveTexture nvTexture = new NveTexture();
nvTexture.setTextureId(displayTex);
Texture.setTextureType(NveTextureType.NV_OES_TEXTURE);
nvTexture.setSize(new NveSize(texWidth, texHeight));
nvTexture.setMirror(mCameraProxy.isFlipHorizontal());
mRenderInput.setTexture(nvTexture);
//输入Buffer
NveImageBufferbuffer = new NveImageBuffer();
buffer.setData(data);
buffer.setSize(new NveSize(bufferWidth, bufferHeight));
buffer.setDisplayRotation(mOrientation);
buffer.setMirror(mCameraProxy.isFlipHorizontal());
mRenderInput.setImageBuffer(buffer);
//渲染
NveRenderOutput renderOutput = mNvEffectKit.renderEffect(mRenderInput);
......
if (null != renderOutput) {
//回收render out
NveEffectKitt.recycleOutput(renderOutput);
}

5.资源释放

在退出或者不再需要渲染时,需要释放相关资源,可调用下面的方法

NveEffectKit.getInstance().cleanUp();

注意:该方法需要在GLContext所在的线程调用

销毁

在页面退出或者应用杀死的情况下进行SDK的销毁,可调用下面的方法

NveEffectKit.getInstance().destroy();

注意:如果是在某个页面退出时进行销毁,那么在其他地方还需要使用SDK,那么在使用前就需要重新初始化SDK,即调用init方法