美摄SDK For HarmonyOS Next
3.14.2
|
NveEffectKit集成了美颜、美型、美妆、妆容、滤镜、人脸道具功能。依赖库为3.8.0以上的美摄Effect库
NvStreamingSdk_Android_..._ARSCENE_MS.zip
)./samples/android/NvEffectKitDemo
快速体验相关功能。Android打包为AAR库(NveEffectKit.aar
),复制到libs目录下(./app/libs
),在build.gradle设置aar的编译引入 >NveEffectKit.aar路径: ./samples/android/NvEffectKitDemo/libBase/libs/NveEffectKit.aar
init时需传入授权文件路径,该路径可以是assets下路径,或本地的绝对路径。 effectsdkdemo.lic
请联系美摄商务获取
初始化模型,需传入模型类型和路径(路径可以为assets路径或本地绝对路径)
类型 | 名称 | 用途 |
---|---|---|
NveDetectionModelType.FACE | 人脸 | 人脸道具使用 |
NveDetectionModelType.FAKE_FACE | 假脸 | 人脸道具使用 |
NveDetectionModelType.MAKEUP2 | 美妆 | 美妆使用 |
NveDetectionModelType.FACE_COMMON | 人脸通用 | 美颜和美妆使用 |
NveDetectionModelType.ADVANCED_BEAUTY | 高级美颜 | 美颜和妆容使用 |
NveDetectionModelType.EYEBALL | 眼球 | 部分人脸道具会用到眼球效果 |
NveDetectionModelType.SEGMENTATION | 背景分割 | 部分人脸道具会用到分割效果 |
NveDetectionModelType.AVATAR | Avatar | 根据表情动的特效果类别会使用这个模型 |
samples/android/NvEffectKitDemo/app/src/main/java/com/meicam/effectsdkdemo/Constants.java
samples/android/NvEffectKitDemo/app/src/main/java/com/meicam/effectsdkdemo/camera/...
参数 | 类型 | 用途 |
---|---|---|
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 |
名称 | 用途 |
---|---|
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] |
名称 | 用途 |
---|---|
NveMicroShapeTypeEnum.HEAD_SIZE | 缩头,[-1,1] |
NveMicroShapeTypeEnum.CHEEKBONE_WIDTH | 颧骨宽,[-1,1] |
NveMicroShapeTypeEnum.JAW_WIDTH | 下颌宽,[-1,1] |
NveMicroShapeTypeEnum.TEMPLE_WIDTH | 太阳穴宽,[-1,1] |
NveMicroShapeTypeEnum.NASOLABIAL_FOLDS | 法令纹,[0,1] |
NveMicroShapeTypeEnum.DARK_CIRCLES | 黑眼圈,[0,1] |
NveMicroShapeTypeEnum.BRIGHTEN_EYES | 亮眼,[0,1] |
NveMicroShapeTypeEnum.WHITEN_TEETH | 美牙,[0,1] |
NveMicroShapeTypeEnum.EYE_ANGLE_DEGREE | 眼角度,[-1,1] |
NveMicroShapeTypeEnum.EYE_DISTANCE | 眼离,[-1,1] |
NveMicroShapeTypeEnum.EYE_HEIGHT | 眼高度,[-1,1] |
NveMicroShapeTypeEnum.EYE_WIDTH | 眼宽度,[-1,1] |
NveMicroShapeTypeEnum.EYE_ARC | 眼弧度,[-1,1] |
NveMicroShapeTypeEnum.EYE_Y_OFFSET | 眼上下,[-1,1] |
NveMicroShapeTypeEnum.PHILTRUM | 人中,[-1,1] |
NveMicroShapeTypeEnum.NOSE_BRIDGE_WIDTH | 鼻梁宽度,[-1,1] |
NveMicroShapeTypeEnum.NOSE_HEAD | 鼻头,[-1,1] |
NveMicroShapeTypeEnum.EYEBROW_THICKNESS | 眉毛粗细,[-1,1] |
NveMicroShapeTypeEnum.EYEBROW_ANGLE | 眉角度,[-1,1] |
NveMicroShapeTypeEnum.EYEBROW_Y_OFFSET | 眉上下,[-1,1] |
NvMicroShapeTypeEnum.EYEBROW_X_OFFSET | 眉间距,[-1,1] |
美颜、美型、微整形的各个参数均来自于美摄文档仓库中AR Scene的说明,更多进阶用法见上方链接。
json解析安装等可参考: samples/android/NvEffectKitDemo/app/src/main/java/com/meicam/effectsdkdemo/data/NvAssetManager samples/android/NvEffectKitDemo/app/src/main/java/com/meicam/effectsdkdemo/data/AssetInfoData
名称 | 用途 |
---|---|
NveMakeupTypeEnum.Lip | 口红 |
NveMakeupTypeEnum.Eyebrow | 眉毛 |
NveMakeupTypeEnum.Eyeshadow | 眼影 |
NveMakeupTypeEnum.Eyelash | 睫毛 |
NveMakeupTypeEnum.Eyeliner | 眼线 |
NveMakeupTypeEnum.Blusher | 腮红 |
NveMakeupTypeEnum.Shadow | 修容 |
NveMakeupTypeEnum.Brighten | 高光 |
NveMakeupTypeEnum.ComposeMakeup | 妆容 |
json解析安装等可参考: samples/android/NvEffectKitDemo/app/src/main/java/com/meicam/effectsdkdemo/data/NvAssetManager samples/android/NvEffectKitDemo/app/src/main/java/com/meicam/effectsdkdemo/data/AssetInfoData samples/android/NvEffectKitDemo/app/src/main/java/com/meicam/effectsdkdemo/data/FilterJsonParseData
json解析安装等可参考: samples/android/NvEffectKitDemo/app/src/main/java/com/meicam/effectsdkdemo/data/NvAssetManager samples/android/NvEffectKitDemo/app/src/main/java/com/meicam/effectsdkdemo/data/AssetInfoData samples/android/NvEffectKitDemo/app/src/main/java/com/meicam/effectsdkdemo/data/StickerJsonParseData
自定义特效
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);
包安装
上述的内容中基本都涉及包安装,官网有安装说明
可以使用已经封装好的工具类(NvAssetPackageManagerUtil)示例代码:
//packagePath 此处为模拟路径,替换为实际资源包路径String packagePath = "assets:/beauty/shape/shapePackage/63BD3F32-D01B-4755-92D5-0DE361E4045A.1.facemesh";// 资源包授权文件路径String packageLicPath = "assets:/beauty/shape/shapePackage/63BD3F32-D01B-4755-92D5-0DE361E4045A.1.lic";//如果资源的结尾是facemesh则类型为ASSET_PACKAGE_TYPE_FACE_MESH,如果是warp则为ASSET_PACKAGE_TYPE_WARP//63BD3F32-D01B-4755-92D5-0DE361E4045A.1.facemeshint packageType = NvsAssetPackageManager.ASSET_PACKAGE_TYPE_FACE_MESH;//63BD3F32-D01B-4755-92D5-0DE361E4045A.1.warp// int packageType = NvsAssetPackageManager.ASSET_PACKAGE_TYPE_WARP;//shapePackageID:资源包ID(包需要安装,安装见下面安装使用)String shapePackageID = NveAssetPackageManagerUtil.installFxPackage(packagePath, packageLicPath, packageType);其中需要重点关注的参数有:
1、packagePath– 安装包的路径,可以为assets路径或者本地绝对路径
2、packageLicPath– 安装包的授权文件路径
3、packageType– 安装包类型,具体类型见:美摄SDK For Android: com.meicam.sdk.NvsAssetPackageManager类 参考 (meishesdk.com)
渲染
1.RenderCore相关初始化
//注:需提前初始化SDKNveEffectKit.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);//输入BufferNveImageBufferbuffer = 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 outNveEffectKitt.recycleOutput(renderOutput);}5.资源释放
在退出或者不再需要渲染时,需要释放相关资源,可调用下面的方法
NveEffectKit.getInstance().cleanUp();注意:该方法需要在GLContext所在的线程调用
销毁
在页面退出或者应用杀死的情况下进行SDK的销毁,可调用下面的方法
NveEffectKit.getInstance().destroy();注意:如果是在某个页面退出时进行销毁,那么在其他地方还需要使用SDK,那么在使用前就需要重新初始化SDK,即调用init方法
常见问题
1.使用Android Studio较高版本时run apk失败,需要修改Gradle JDK版本为 jdk 11
>Settings->Build,Execution,Deployment->Build Tools->Gradle->Gradle JDK (
java 11
)类似错误:
FAILURE: Build completed with 2 failures.1: Task failed with an exception.-----------* What went wrong:Execution failed for task ':app:processDebugMainManifest'.> Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to unnamed module @16a1c82d* Try:Run with --info or --debug option to get more log output. Run with --scan to get full insights.* Exception is:org.gradle.api.tasks.TaskExecutionException: Execution failed for taskCaused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to unnamed module @16a1c82d2.模型中face240和face106有什么区别?
240和160指的是人脸模型的点位数量,240效果更佳。
160点位不支持美妆
。3.普通磨皮,高级磨皮1,高级磨皮2,高级磨皮3有什么区别?
高级磨皮1
是Android
端标准效果,高级磨皮2
是iOS
端标准效果,高级磨皮3
是男性
效果. 详情见文档:AR Scene Advanced Beauty Type4.美颜A,美颜B有什么区别?
实现方式不同,
美颜B
使用Lut
文件。 详情见文档:AR Scene Whitening Lut File5.是否支持自定义GLSurfaceView/相机预览?
代码中示例供参考,如果用户已有相关实现,可以提供要渲染的纹理或者buffer 数据即可。详情可咨询美摄技术支持
6.导入项目后,渲染无效果或黑屏?
检查项目中
lic
文件与applicationId
是否绑定。详情可咨询美摄商务7.已接入NvAndroidStreamingSdk.jar,冲突如何处理?
删除项目中原
NvAndroidStreamingSdk.jar
,重新依赖NveEffectKit.aar
。