libxmagic HAR 接入文档(HarmonyOS / OpenHarmony)
适用版本:libxmagic 1.0.0
目标平台:HarmonyOS NEXT(API 12+)
支持 ABI:
arm64-v8a概述
libxmagic 是腾讯特效 SDK 在 OpenHarmony 平台的 HAR 封装,对外暴露 ArkTS 接口(XMagicKit / TELicenseCheck / XmagicConstant),底层通过 libxmagic.so 桥接到 C++ 实现,封装了:美颜 / 美型 / 滤镜 / 风格整妆 / 2D & 3D 贴纸 / 虚拟背景等所有腾讯特效能力。
License 鉴权(含本地缓存、备份域名容灾)。
OpenGL 纹理处理(输入纹理 ID → 处理 → 输出纹理 ID,全 GPU 链路)。
宿主只需提供 OpenGL 纹理 ID 和分辨率,即可获得处理后的输出纹理。
说明:
鸿蒙 License 单独计费,请联系商务获取 License。
集成准备
1. 工程结构
将
libxmagic 目录放入工程根目录,与 entry 同级:YourProject/├── AppScope/├── entry/ # 业务模块├── libxmagic/ # ← 本 HAR 模块│ ├── libs/arm64-v8a/ # SDK 静态库 + .so│ ├── src/main/cpp/ # NAPI 桥接源码│ ├── src/main/ets/ # ArkTS 封装│ └── oh-package.json5├── build-profile.json5└── oh-package.json5
2. 在 build-profile.json5 中注册模块
{"modules": [{ "name": "entry", "srcPath": "./entry" },{ "name": "libxmagic", "srcPath": "./libxmagic" }]}
3. 在业务模块 entry/oh-package.json5 中添加依赖
{"dependencies": {"libxmagic": "file:../libxmagic","libxmagic.so": "file:../libxmagic/src/main/cpp/types/libxmagic"}}
注意:
必须同时声明:HAR 仓内的 ArkTS 封装由
libxmagic 提供;底层 NAPI 接口由 libxmagic.so 提供。4. 配置 ABI
entry/build-profile.json5 与 libxmagic/build-profile.json5 中保持 ABI 一致:"abiFilters": ["arm64-v8a"]
5. 申请权限
在
entry/src/main/module.json5 中声明:"requestPermissions": [{ "name": "ohos.permission.CAMERA", "reason": "$string:camera_reason","usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } },{ "name": "ohos.permission.INTERNET" } // license 在线鉴权需要]
资源文件准备
XMagic SDK 运行时需要在沙箱中读取两类资源:
资源 | 路径(沙箱) | 说明 |
LightCore.bundle(必备) | ${filesDir}/res/LightCore.bundle | AI 模型 / 着色器 / 数据文件,所有特效都需要。 |
MotionRes(贴纸 / 动效) | ${filesDir}/MotionRes/... | 仅使用动效 / 贴纸时需要。 |
推荐做法:把
res.zip(含 LightCore.bundle)和 MotionRes.zip 放到 entry/src/main/resources/rawfile/,首次启动时解压到 filesDir。参考实现(demo
Index.ets):import { fileIo as fs } from '@kit.CoreFileKit';import { zlib } from '@kit.BasicServicesKit';import { common } from '@kit.AbilityKit';private async ensureLightCoreBundle(): Promise<string> {const ctx = getContext(this) as common.UIAbilityContext;const filesDir = ctx.filesDir;const bundleDest = filesDir + '/res';const zipDest = filesDir + '/res.zip';if (fs.accessSync(bundleDest)) {return bundleDest; // 已解压,直接复用}// 1. rawfile → 沙箱临时文件const zipBytes: Uint8Array = await ctx.resourceManager.getRawFileContent('res.zip');const f = fs.openSync(zipDest, fs.OpenMode.WRITE_ONLY | fs.OpenMode.CREATE | fs.OpenMode.TRUNC);fs.writeSync(f.fd, zipBytes.buffer as ArrayBuffer);fs.closeSync(f);// 2. 解压await zlib.decompressFile(zipDest, filesDir,{ level: zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION });// 3. 清理临时 ziptry { fs.unlinkSync(zipDest); } catch {}return bundleDest;}
MotionRes.zip 同理。License 鉴权
XMagic 使用前必须通过
TELicenseCheck 鉴权,否则 initialize / processTexture 不会生效。1. 在线鉴权(推荐)
import { TELicenseCheck } from 'libxmagic';const LICENSE_URL = 'https://xxxx.trtcube-license.vod-test.com/license/.../v_cube.license';const LICENSE_KEY = '<从腾讯云控制台获取的 KEY>';TELicenseCheck.setTELicense(LICENSE_URL, LICENSE_KEY).then((res) => {if (res.code === 0) {console.info('license ok');// → 此后才能调用 XMagicKit.initialize / processTexture} else {console.error(`license failed: code=${res.code} msg=${res.message}`);}});
2. 鉴权流程(自动完成)
1. 优先读取沙箱缓存(
${filesDir}/xmagic.license.tmp)→ 验证成功直接返回,并在后台静默更新。2. 缓存失效时,下载主域名 license 文件 → 验证 → 写缓存。
3. 主域名失败时,自动尝试5个备份域名。
3. 离线 / 本地 license
如果业务自行下发 license 字符串,直接调用静态方法:
const code = TELicenseCheck.verifyLicense(licenseString, LICENSE_KEY);// code === 0 表示成功
SDK 生命周期
XMagicKit 是核心入口,全部为静态方法,内部维护单例状态。1. 初始化
注意:
必须在 OpenGL 渲染线程调用,调用前确保当前线程已绑定有效的 EGL Context。
import { XMagicKit, XmagicConstant } from 'libxmagic';const ok: boolean = XMagicKit.initialize(width, // 输入纹理宽度(像素)height, // 输入纹理高度(像素)resDir, // LightCore.bundle 的父目录,例如 filesDir + '/res'XmagicConstant.EFFECT_MODE_PRO // 可选:EFFECT_MODE_NORMAL / EFFECT_MODE_PRO);
effectMode | 说明 |
EFFECT_MODE_NORMAL (0) | 高性能模式,使用 V8 美颜,低端模型,省功耗。 |
EFFECT_MODE_PRO (1) | 专业模式,使用 V7 美颜,高端模型,效果更好(默认)。 |
2. 每帧处理
const outTexId: number = XMagicKit.processTexture(inputTexId, // 输入纹理 ID(OES 已解码到 RGBA)width, // 输入纹理宽度height // 输入纹理高度);// outTexId 为输出纹理 ID(GL_TEXTURE_2D, RGBA8)// 未初始化或鉴权失败时,会原样返回 inputTexId
坐标系:XMagic 真正处理过的输出纹理上下翻转。若直接渲染到屏幕,需在 vertex shader 中处理
flipY,或调用渲染时手动翻转 V 坐标。Demo 中根据
outTexId !== inputTexId 判定是否需要 flipY:const flipY = outTexId !== 0 && outTexId !== inputTexId;entry.nativeRenderTexture(XCOMPONENT_ID, outTexId, flipY);
3. 释放
页面销毁 / Surface 销毁时调用:
XMagicKit.release();
释放后再次使用需重新
initialize。设置特效(setEffect)
setEffect 可在任意线程随时调用。内部把参数缓存到队列,下一次 processTexture 时由渲染线程消费下发,避免跨线程调用 OpenGL。XMagicKit.setEffect(effectName, // 特效 key(详见 XmagicConstant)effectValue, // 强度,整数 0~100resourcePath, // 资源路径或空串extraInfo // 可选额外参数 Record<string, string>);
1. 美颜示例
import { XMagicKit, XmagicConstant } from 'libxmagic';// 磨皮 80%XMagicKit.setEffect(XmagicConstant.BEAUTY_SMOOTH, 80, '');// 美白 60%XMagicKit.setEffect(XmagicConstant.BEAUTY_WHITEN, 60, '');// 大眼 50%XMagicKit.setEffect(XmagicConstant.BEAUTY_ENLARGE_EYE, 50, '');
2. 滤镜示例
// 滤镜资源路径取自 lut.jsonXMagicKit.setEffect(XmagicConstant.EFFECT_LUT,100,resDir + '/lut/filter_xxx.png');
3. 2D / 3D 贴纸(动效)示例
// motionResPath 为 MotionRes 解压根目录const stickerDir = motionResPath + '/2dMotionRes/video_xxx';XMagicKit.setEffect(XmagicConstant.EFFECT_MOTION, 100, stickerDir);
3D 贴纸使用相同接口,仅资源目录不同(参考
motion_3d.json)。4. 关闭某个特效
XMagicKit.setEffect(XmagicConstant.EFFECT_MOTION, 0, '');// 或 setEffect(XmagicConstant.XMAGIC_PROPERTY_ID_NONE, 0, '');
5. AI 能力开关
XMagicKit.setFeatureEnableDisable(XmagicConstant.SEGMENTATION_SKIN, true);XMagicKit.setFeatureEnableDisable(XmagicConstant.SMART_BEAUTY, true);
支持的 key 见
XmagicConstant:SEGMENTATION_SKIN:皮肤分割。BEAUTY_ONLY_WHITEN_SKIN:仅美白皮肤。SMART_BEAUTY:智能美颜。AI_FACE_STATIC_FEATURE_ENABLE:静态人脸特征。SEGMENTATION_FACE_BLOCK:人脸遮挡分割。SKIN_RETOUCH:智能祛斑祛痘。完整接入示例(关键片段)
import { displaySync } from '@kit.ArkGraphics2D';import { XMagicKit, TELicenseCheck, XmagicConstant } from 'libxmagic';@Entry @Componentstruct CameraPage {private isLicenseOk = false;private isXmagicOk = false;private xmagicResDir = '';private cameraW = 0;private cameraH = 0;aboutToAppear() {// 1. 鉴权(异步)TELicenseCheck.setTELicense(LICENSE_URL, LICENSE_KEY).then(r => {this.isLicenseOk = (r.code === 0);});// 2. 准备 LightCore.bundle 资源(异步)this.ensureLightCoreBundle().then(dir => { this.xmagicResDir = dir; });}aboutToDisappear() {XMagicKit.release();}// 在每帧 GL 回调中:private onFrame(inputTexId: number) {// 3. 首帧到来后惰性初始化(必须在 GL 线程)if (!this.isXmagicOk && this.isLicenseOk && this.xmagicResDir) {this.isXmagicOk = XMagicKit.initialize(this.cameraH, this.cameraW, this.xmagicResDir);}// 4. 处理纹理(未初始化时透传 inputTexId)const outTexId = XMagicKit.processTexture(inputTexId, this.cameraH, this.cameraW);// 5. 上屏(注意 flipY)const flipY = this.isXmagicOk && outTexId !== inputTexId;renderToSurface(outTexId, flipY);}// UI 事件触发:private onSmoothChanged(value: number) {XMagicKit.setEffect(XmagicConstant.BEAUTY_SMOOTH, value, '');}}
说明:
完整可运行示例参考
entry/src/main/ets/pages/Index.ets。常见 effectName 速查(详见 XmagicConstant.ets)
美颜(Beauty)
常量 | 含义 |
BEAUTY_SMOOTH | 磨皮 |
BEAUTY_WHITEN | 美白 |
BEAUTY_ROSY | 红润 |
BEAUTY_CONTRAST | 对比度 |
BEAUTY_SATURATION | 饱和度 |
BEAUTY_CLEAR | 清晰度 |
BEAUTY_SHAPE | 锐化 |
美型(Shape,basicV7.* 系列)
常量 | 含义 |
BEAUTY_ENLARGE_EYE | 大眼 |
BEAUTY_FACE_NATURE / _GODNESS / _MALE_GOD | 瘦脸(自然/女神/英俊) |
BEAUTY_FACE_V | V 脸 |
BEAUTY_FACE_THIN / _SHORT | 窄脸 / 短脸 |
BEAUTY_NOSE_THIN / _WING | 瘦鼻 / 鼻翼 |
BEAUTY_MOUTH_SIZE / _HEIGHT | 嘴型 / 嘴唇厚度 |
美体(Body)
常量 | 含义 |
BODY_AUTOTHIN_BODY_STRENGTH | 一键瘦身 |
BODY_LEG_STRETCH / BODY_SLIM_LEG_STRENGTH | 长腿 / 瘦腿 |
BODY_WAIST_STRENGTH / BODY_THIN_SHOULDER_STRENGTH | 瘦腰 / 瘦肩 |
高层入口
常量 | 含义 |
EFFECT_LUT | 滤镜 |
EFFECT_MAKEUP / EFFECT_LIGHT_MAKEUP | 美妆 / 轻美妆 |
EFFECT_MOTION | 动效 / 2D & 3D 贴纸 |
EFFECT_SEGMENTATION | 虚拟背景 / 绿幕分割 |
常见问题
processTexture 返回值与输入相同
license 未鉴权成功(
isLicenseOk 仍为 false)。initialize 在 GL 线程外调用,或 EGL Context 未绑定。resDir 错误,或 LightCore.bundle 未解压。版本与依赖
HAR:
libxmagic 1.0.0底层 SO:
libxmagic.so(同 HAR 一起发布)依赖运行时(系统):
libace_napi.z.so、libEGL.so、libGLESv3.solibhilog_ndk.z.so、libimage_source.so、libpixelmap.so、libimage_common.solibability_runtime.so、libdeviceinfo_ndk.z.so、libbundle_ndk.z.so、libohcrypto.so依赖动态库(HAR 提供):
libTNN.so、libYTCommonXMagic.so、libpag.so附:关键文件索引
文件 | 作用 |
libxmagic/src/main/ets/XMagicKit.ets | ArkTS 主入口(initialize / processTexture / setEffect / release)。 |
libxmagic/src/main/ets/TELicenseCheck.ets | License 在线鉴权 + 本地缓存。 |
libxmagic/src/main/ets/XmagicConstant.ets | 所有特效 key 常量。 |
libxmagic/src/main/cpp/CMakeLists.txt | 静态库链接配置。 |
entry/src/main/ets/pages/Index.ets | Demo:相机预览 + XMagic 全链路。 |
entry/src/main/ets/components/beauty/BeautyPanel.ets | Demo:美颜面板 UI。 |
entry/src/main/resources/rawfile/*.json | Demo:各 tab 数据源(beauty / lut / motion_2d / motion_3d / makeup / segmentation)。 |