帮你快速理解、总结文档立即下载

HarmonyOS

最近更新时间:2026-09-15 17:26:30
我的收藏

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.json5libxmagic/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. 清理临时 zip
try { 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。
setEffect 参数参考 美颜参数说明
XMagicKit.setEffect(
effectName, // 特效 key(详见 XmagicConstant)
effectValue, // 强度,整数 0~100
resourcePath, // 资源路径或空串
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.json
XMagicKit.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 @Component
struct 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.solibEGL.solibGLESv3.so
libhilog_ndk.z.solibimage_source.solibpixelmap.solibimage_common.so
libability_runtime.solibdeviceinfo_ndk.z.solibbundle_ndk.z.solibohcrypto.so
依赖动态库(HAR 提供):libTNN.solibYTCommonXMagic.solibpag.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)。