XmagicApi.java
,用于初始化 SDK、更新美颜数值、调用动效等功能。API | 描述 |
VERSION | 通过XmagicApi.VERSION可获取SDK的版本号(V3.5.0新增)。 |
设置 so库的路径,如果so库是内置在apk包里的,则无需使用该接口。 | |
将应用程序 assets 下 Light3DPlugin、LightCore、LightHandPlugin、LightBodyPlugin、LightSegmentPlugin 文件夹中的内容复制到指定目录中。 | |
将客户下载好的 AI 模型文件复制到对应的文件夹下。 | |
获取设备等级。 |
API | 描述 |
构造函数。 | |
SDK 渲染数据的方法,用于处理图片或视频流。 | |
设置美颜、美型、滤镜、美妆、贴纸、分割等效果,可在任意线程调用。 | |
设置 SDK 的 log 等级,默认为 Log.WARN 。开发调试阶段如有需要,可以将其设为Log.DEBUG。 正式发布时务必设置为Log.WARN 或Log.ERROR ,否则大量的日志会影响性能。在 new XmagicApi() 之后调用。 | |
调用此方法开启高性能模式。高性能模式开启后,美颜占用的系统 CPU/GPU 资源更少,可减少手机的发热和卡顿现象,更适合低端机长时间使用。 在 new XmagicApi() 之后调用。 | |
开启或关闭某个能力。 | |
设置输入数据类型,有相机数据和图片数据两类,默认是相机数据流。 | |
设置人脸、手势、身体检测状态回调。 | |
动效素材使用时是否开启静音。参数:true 表示静音,false 表示非静音。 | |
暂停特效里的声音播放,可与 Activity onPause 生命周期绑定。 | |
恢复特效里的声音播放,可与 Activity onResume 生命周期绑定。 | |
销毁 xmagic,需要在 GL 线程中调用。 | |
设置图像方向,使 AI 对不同朝向的人脸都能识别到,如果设置,则忽略 sensorChanged 传入的方向。 | |
利用系统传感器判断当前手机旋转的角度,使 AI 对不同朝向的人脸都能识别到。 | |
将一个动效素材的路径传给SDK,检测当前设备是否完全支持这个动效。 | |
判断当前机型是否支持美颜(OpenGL3.0)。 | |
获取当前纹理上的画面 | |
设置动效提示语回调函数,用于将提示语展示到前端页面上。 | |
updateProperty updateProperties setYTDataListener onPauseAudio getDeviceAbilities getPropertyRequiredAbilities isBeautyAuthorized enableEnhancedMode setDowngradePerformance |
new XmagicApi()
之前调用。 data/data/包名/files/xmagic_libs
,将从这个目录去加载 so。static boolean setLibPathAndLoad(String path)
static int addAiModeFilesFromAssets(Context context, String resDir)
static int addAiModeFiles(String inputResDir, String resDir)
static DeviceLevel getDevicLevel(Context context)public enum DeviceLevel { DEVICE_LEVEL_VERY_LOW(1), DEVICE_LEVEL_LOW(2), DEVICE_LEVEL_MIDDLE(3), DEVICE_LEVEL_MIDDLE_HIGH(4), DEVICE_LEVEL_HIGH(5); private final int value; DeviceLevel(int value) { this.value = value; } public int getValue() { return value; } }
XmagicApi(Context context, String resDir)XmagicApi(Context context, String resDir,OnXmagicPropertyErrorListener xmagicPropertyErrorListener)public interface OnXmagicPropertyErrorListener { void onXmagicPropertyError(String errorMsg, int code); }
参数 | 类型 | 含义 |
context | Context | 上下文。 |
resDir | String | SDK模型资源文件目录。 在使用SDK之前,需要先确定一个目录用于存放SDK的模型资源文件,建议使用app私有目录: resDir = context.getFilesDir().getAbsolutePath() + "/xmagic" |
xmagicPropertyErrorListener | OnXmagicPropertyErrorListener | 错误回调接口。在使用SDK过程中,此接口会回调内部的一些错误信息。一般在开发调试时使用。 |
错误码 | 含义 |
-1 | 未知错误。 |
-100 | 3D 引擎资源初始化失败。 |
-200 | 不支持 GAN 素材。 |
-300 | 设备不支持此素材组件。 |
-400 | 模板 JSON 内容为空。 |
-500 | SDK 版本过低。 |
-600 | 不支持分割。 |
-700 | 不支持 OpenGL。 |
-800 | 不支持脚本。 |
5000 | 分割背景图片分辨率超过 2160×3840。 |
5001 | 分割背景图片所需内存不足。 |
5002 | 分割背景视频解析失败。 |
5003 | 分割背景视频超过200秒。 |
5004 | 分割背景视频格式不支持。 |
5005 | 分割背景图片存在旋转角度 |
//渲染纹理int process(int srcTextureId, int srcTextureWidth, int srcTextureHeight)//渲染bitmapBitmap process(Bitmap bitmap, boolean needReset)
参数 | 含义 |
int srcTextureId | 需要被渲染的纹理。类型为:OpenGL 2D 纹理格式,像素格式为 RGBA。 |
int srcTextureWidth | 需要被渲染的纹理宽。 |
int srcTextureHeight | 需要被渲染的纹理高。 |
Bitmap bitmap | 建议最大尺寸 2160×4096。超过这个尺寸的图片人脸识别效果不佳或无法识别到人脸,同时容易引起 OOM 问题,建议把大图缩小后再传入。 |
boolean needReset | 以下几种场景请将needReset设置为true 首次process一张图片,或切换图片。 首次使用分割。 首次使用动效。 首次使用美妆。 |
void setEffect(String effectName, int effectValue, String resourcePath, Map<String, String> extraInfo)
Log.WARN
。开发调试阶段如有需要,可以将其设为Log.DEBUG。
正式发布时务必设置为Log.WARN
或Log.ERROR
,否则大量的日志会影响性能。ITELogger
,则会把SDK内部的日志回调给使用者。public void setXmagicLogLevel(int level);public void setXmagicLogLevel(int level, final ITELogger logger);public interface ITELogger{ void log(int severity, String tag, String msg); void log(int severity, String tag, String msg, Throwable throwable); }
void enableHighPerformance()
void setFeatureEnableDisable(String featureName, boolean enable)
参数 | 含义 |
String featureName | 原子能力名称 取值如下: XmagicConstant.FeatureName.SEGMENTATION_SKIN 皮肤分割能力,开启后可使磨皮和美白区域更精准。XmagicConstant.FeatureName.SEGMENTATION_FACE_BLOCK 人脸遮挡检测能力,开启后可避免妆容画到遮挡物上。XmagicConstant.FeatureName.WHITEN_ONLY_SKIN_AREA 美白仅对皮肤生效XmagicConstant.FeatureName.SMART_BEAUTY 智能美颜(为男性、宝宝减淡美颜美妆效果)XmagicConstant.FeatureName.ANIMOJI_52_EXPRESSION 人脸表情能力XmagicConstant.FeatureName.BODY_3D_POINT 身体点位能力XmagicConstant.FeatureName.HAND_DETECT 手势检测能力 |
boolean enable | true 表示开启此能力,false 表示关闭此能力 |
SEGMENTATION_SKIN
和 SEGMENTATION_FACE_BLOCK
,SDK会根据getDeviceLevel的值默认开启这两项能力。如果您需要手动开启,建议在 level >=4 时,开启 SEGMENTATION_SKIN
, 在 level >= 5时,开启 SEGMENTATION_FACE_BLOCK
。void setXmagicStreamType(int type)
参数 | 含义 |
int type | 数据源类型,有以下两种选择: XmagicApi.PROCESS_TYPE_CAMERA_STREAM :相机数据源。XmagicApi.PROCESS_TYPE_PICTURE_DATA :图片数据源。 |
public void setAIDataListener(final XmagicAIDataListener aiDataListener);public interface OnAIDataListener {void onFaceDataUpdated(List<TEFaceData> faceDataList);void onBodyDataUpdated(List<TEBodyData> bodyDataList);void onAIDataUpdated(String jsonString);@Deprecatedvoid onHandDataUpdated(List<TEHandData> handDataList);}
onAIDataUpdated
回调的数据。public class TEFaceData { public float[] points; public TEFaceData() { } public TEFaceData(float[] points) { this.points = points; } }
onAIDataUpdated
回调的数据。face_info
的详细说明,请查看人脸点位。hand_info
的详细说明,请查看手势识别。body_3d_info
的详细说明,请查看 身体点位Android 和 身体点位iOS。{"face_info": [{"expression_weights": [0.001172, 0, 0.029249, ... , 0.060041, 0],"face_256_point": [211.844238, 673.247192, ... , 339.247925, 654.792603],"face_256_visible": [0.163925, 0.14921, ... , 0.99887, 0.99887],"face_3d_info": {"pitch": -3.860844850540161,"pitch_fixed": 2.1123428344726562,"roll": -12.797032356262207,"roll_fixed": 1.3187808990478516,"transform": [[0.8919625878334045, 0.2843534052371979, 0.3514907658100128, 0],[-0.17628398537635803, 0.9346542954444885, -0.3087802827358246, 0],[-0.41632509231567383, 0.21345829963684082, 0.88380366563797, 0],[-0.020958196371793747, -0.04502145200967789, -0.6078543663024902, 1]],"yaw": 24.824481964111328,"yaw_fixed": 25.02082061767578},"left_eye_high_vis_ratio": 0,"left_eyebrow_high_vis_ratio": 0,"mouth_high_vis_ratio": 1,"out_of_screen": false,"right_eye_high_vis_ratio": 1,"right_eyebrow_high_vis_ratio": 0.821429,"trace_id": 21}],"hand_info": {"gesture": "PAPER","hand_point_2d": [180.71888732910156, 569.2958984375, ... , 353.8714294433594, 836.246826171875]},"body_3d_info": {"imageHeight": 652,"imageWidth": 320,"items": [{"index": 1,"pose": [0.049122653901576996, ... , 0],"position_x": [190.47494506835938, 235.23098754882812, ... , 4.948424339294434, 173.59298706054688],"position_y": [777.2109375, 836.488037109375, ... , 161.19752502441406, 405.83905029296875],"position_z": [0, 0, ... , 0, 0],"rotation": [{"data": [0.9944382905960083, -0.09695644676685333, -0.0411277711391449, 0.000708006089553237]},......{"data": [0.9907779693603516, 0.13549542427062988, 0, 0]}, {"data": [1, 0, 0, 0]}]}]}}
void onPause()
void onResume()
//示例代码见 TECameraBaseActivity.javapublic void onGLContextDestroy() { if (this.mXMagicApi != null) { this.mXMagicApi.onDestroy(); this.mXMagicApi = null; } }
void setImageOrientation(TEImageOrientation orientation)public enum TEImageOrientation { ROTATION_0, ROTATION_90, ROTATION_180, ROTATION_270 }
sensorChanged
传入的方向。方向示例如下:void sensorChanged(android.hardware.SensorEvent event, android.hardware.Sensor accelerometer)
setImageOrientation
设置了固定的方向,则会忽略 sensorChagned
传入的方向。public class MyActivity implements SensorEventListener {private SensorManager mSensorManager;private Sensor mAccelerometer;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);}@Overrideprotected void onResume() {super.onResume();mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onPause() {super.onPause();mSensorManager.unregisterListener(this);}@Overridepublic void onSensorChanged(SensorEvent event) {if (mXMagicApi != null) {mXMagicApi.sensorChanged(event, mAccelerometer);}}}
boolean isDeviceSupport(String motionResPath)
boolean isSupportBeauty()
void exportCurrentTexture(ExportTextureCallback callback)public interface ExportTextureCallback { void onCallback(Bitmap bitmap); }
void setTipsListener(XmagicApi.XmagicTipsListener effectTipsListener)
public interface XmagicTipsListener { /** * 显示tips。 * @param tips 返回的提示语文本信息。 * @param tipsIcon tips的icon的文件路径,可根据文件路径解析出对应图片,pag文件的话需要使用pagView来展示。* 注意:tipsIcon有可能为空,素材中没有配置就返回空值 * @param type tips类别,0表示tips和tipsIcon 都有值,1表示是pag素材只有tipsIcon有值。 * @param duration tips显示时长, 毫秒 */ void tipsNeedShow(String tips, String tipsIcon, int type, int duration); /*** * 隐藏tips。 * @param tips 返回的提示语文本信息。 * @param tipsIcon tips的icon的文件路径,可根据文件路径解析出对应图片,pag文件的话需要使用pagView来展示。* 注意:tipsIcon有可能为空,素材中没有配置就返回空值 * @param type tips类别,0表示tips和tipsIcon 都有值,1表示是pag素材只有tipsIcon有值。 */ void tipsNeedHide(String tips, String tipsIcon, int type); }
public void tipsNeedShow(final String tips, String tipsIcon, int type, int duration) {final int tipsType = type;final String tipsIconPath = tipsIcon;mMainThreadHandler.post(new Runnable() {@Overridepublic void run() {if (tipsType == 0) {if (!TextUtils.isEmpty(tipsIconPath) && !mImageTipsIsShow) {mTipsImageView.setVisibility(View.VISIBLE);Bitmap bitmap = BitmapUtils.decodeSampleBitmap(AEModule.getContext(), tipsIconPath, Integer.MAX_VALUE, Integer.MAX_VALUE);mTipsImageView.setImageBitmap(bitmap);mImageTipsIsShow = true;} else {mTipsImageView.setVisibility(View.GONE);}mTipsTextView.setText(tips);} else {pagFile = PAGFile.Load(tipsIconPath);tipsPAGView.post(new Runnable() {@Overridepublic void run() {if (pagFile != null) {tipsPAGView.setRepeatCount(-1);tipsPAGView.setComposition(pagFile);tipsPAGView.setProgress(0);tipsPAGView.play();tipsPAGView.setVisibility(View.VISIBLE);}}});}}});}public void tipsNeedHide(String tips, String tipsIcon, int type) {final int tipsType = type;final String tipsIconPath = tipsIcon;mMainThreadHandler.post(new Runnable() {@Overridepublic void run() {if (tipsType == 0) {mTipsContainer.setVisibility(View.GONE);mImageTipsIsShow = false;} else {tipsPAGView.post(new Runnable() {@Overridepublic void run() {tipsPAGView.stop();tipsPAGView.setVisibility(View.GONE);}});}}});}
void updateProperty(XmagicProperty<?> p)void updateProperties(List<XmagicProperty<?>> properties)
参数 | 含义 |
XmagicProperty<?> p | 腾讯特效数据实体类。 以"磨皮"为例,可以按如下方式 new 一个实例: new XmagicProperty<>(Category.BEAUTY, null, null, BeautyConstant.BEAUTY_SMOOTH, new XmagicPropertyValues(0, 100, 50, 0, 1)); 以“2D 动效兔兔酱”为例,可以按如下方式 new 一个实例: new XmagicProperty<>(Category.MOTION, "video_tutujiang" , "动效的文件路径", null, null); 如果想要某个动效/美妆/分割素材叠加在当前素材上,则将该素材 XmagicProperty 对象的 mergeWithCurrentMotion 设置为 true。关于素材叠加的详细说明见 素材叠加。 更多的例子,请参考 Demo 工程 assets/beauty_panel 文件夹下的配置信息。 |
属性字段 | 说明 |
category | Category.BEAUTY |
ID | null 特殊情况: 瘦脸中的(自然、女神、英俊) ID 值分别为: BeautyConstant.BEAUTY_FACE_NATURE_ID、 BeautyConstant.BEAUTY_FACE_FEMALE_GOD_ID、BeautyConstant.BEAUTY_FACE_MALE_GOD_ID 口红中的 ID 值为: XmagicConstant.BeautyConstant.BEAUTY_LIPS_LIPS_MASK 腮红中的 ID 值为: XmagicConstant.BeautyConstant.BEAUTY_MAKEUP_MULTIPLY_MULTIPLY_MASK 立体中的 ID 值为: XmagicConstant.BeautyConstant.BEAUTY_SOFTLIGHT_SOFTLIGHT_MASK |
resPath | null 特殊情况:口红、腮红、立体的 resPath 是资源图片的路径,具体请参考 Demo 中 assets/beauty_panel/advanced_beauty.json 文件。 |
effkey | 必填,参见 Demo 示例:美白 BeautyConstant.BEAUTY_WHITEN |
effValue | 必填,参见 Demo 中 assets/beauty_panel/advanced_beauty.json 文件,demo 工程中解析该文件构造一个XmagicPropertyValues对象,XmagicPropertyValues各个属性取值见 美颜参数说明 |
属性字段 | 说明 |
category | Category.BODY_BEAUTY |
ID | null |
resPath | null |
effkey | 必填,参见 Demo 示例:长腿 BeautyConstant.BODY_LEG_STRETCH |
effValue | 必填,参见 Demo 中 assets/beauty_panel/beauty_body.json 文件。demo工程中解析该文件构造一个XmagicPropertyValues对象,XmagicPropertyValues各个属性取值见 美颜参数说明 |
属性字段 | 说明 |
category | Category.LUT |
ID | 图片名称,必填 示例:dongjing_lf.png “无” ID 为 XmagicProperty.ID_NONE |
resPath | 滤镜图片路径,必填,“无”设置为 null |
effkey | null |
effValue |
属性字段 | 说明 |
category | Category.MOTION |
ID | 资源文件夹名称,必填 示例:video_lianliancaomei “无” ID 为 XmagicProperty.ID_NONE |
resPath | 必填,参见 Demo |
effkey | null |
effValue | null |
属性字段 | 说明 |
category | Category.MAKEUP |
ID | 资源文件夹名称,必填 示例:video_xuejiezhuang “无” ID 为 XmagicProperty.ID_NONE |
resPath | 必填,参见 Demo |
effkey | 必填,取值为:makeup.strength“无”设置为 null |
effValue |
属性字段 | 说明 |
category | Category.SEGMENTATION |
ID | 资源文件夹名称,必填 示例:video_segmentation_blur_45 “无” ID 为 XmagicProperty.ID_NONE 自定义分割 ID 值必须使用: XmagicConstant.SegmentationId.CUSTOM_SEG_ID |
resPath | 必填,参见 Demo |
effkey | null(自定义背景除外),自定义背景的值为选择的资源路径 |
effValue | null |
参数 | 含义 |
List<XmagicProperty<?>> assets | 需要检测原子能力的动效资源列表。 |
Map<XmagicProperty<?>,ArrayList<String>>
:Map<String,Boolean> getDeviceAbilities()
Map<String,Boolean>
:XmagicProperty.isAuth
字段中。如果 isAuth 字段为 false,可以在 UI 上屏蔽这些项的入口。void isBeautyAuthorized(List<XmagicProperty<?>> properties)
本页内容是否解决了您的问题?