集成
创建引擎返回 nil
- 确认已设置
licenseToken或appId+appKey。两者都有时以 token 为准。 - 在控制台绑定应用 Bundle ID。
- 在线授权需要能访问
/facebetter/v2/auth。 - 在
createEngineWithConfig:之前打开日志,关注事件1(授权失败)和101(初始化失败)。 - CocoaPods:
pod 'Facebetter', '2.0.0'。打开.xcworkspace,不要打开.xcodeproj。
编译找不到头文件或类
- 导入
#import <Facebetter/FBBeautyEffectEngine.h>。 - 手动集成
.framework时设置为 Embed & Sign。 - Clean Build Folder 后重建。
- Xcode 15+ CocoaPods 脚本失败时,将
ENABLE_USER_SCRIPT_SANDBOXING设为 No。
运行时链接 / dyld 错误
- 架构必须是 arm64。
- 部署目标 iOS 12.0+。
- 确认
Facebetter.framework已加入 Embed Frameworks。
授权
licenseToken 与 appId / appKey
licenseToken 非空时,SDK 在本地校验 token / {token} JSON / .lic,不会再发 appId / appKey。否则走在线授权。详见 授权与许可。
事件 1 或 101
授权或初始化失败。检查 Bundle ID、套餐、token 是否过期以及日志。创建返回非 nil 不够,还要监听 onEngineEvent。
美颜
效果太弱或太强
- 美肤 / 美妆 / 滤镜:
[0.0, 1.0]。 - 美型:通过
setReshape:intensity:使用[-1.0, 1.0](0关闭)。 - 美体:通过
setBodyReshape:intensity:使用[0.0, 1.0]。先登记resource_body.fbd。 - 强度为
0即关闭该项。 - 仅皮肤区域:
setBeautySkinOnly:。
FBReshape_FaceThin、FBLipstickColor_Rouge。
滤镜、贴纸、虚拟背景
滤镜或贴纸没有效果
直接传.fbd 路径或字节:
processImage: 处理后生效。空路径 / nil 数据返回 FBErrorCode_InvalidArgument。文件不存在返回 FBErrorCode_IO。
虚拟背景
处理
processImage: 返回 nil
- 引擎为
nil或初始化失败(-2/ 事件101)。 - 帧无效(尺寸为 0、格式不支持)。
externalContext = YES但当前线程没有 GL 上下文。- 按处理失败(
FBErrorCode_Process)处理。
帧类型
将imageFrame.type 设为 FBFrameTypeImage(0)或 FBFrameTypeVideo(1)。不要再传处理模式参数。
格式转换
使用convert: 和帧访问器:
dataY / dataU / dataV / dataUV 及对应 stride*。
UIImage
相机预览
- 从
AVCaptureVideoDataOutput取CVPixelBuffer。 - 用
createWithNV12:...或createWithBGRA:...创建FBImageFrame。 - 设置
type = FBFrameTypeVideo,可选setMirror:@"horizontal"。 processImage:后显示[output data]或[output texture]。
性能与内存
- 实时用
FBFrameTypeVideo;若getStats.avgProcessTimeMs偏高则降分辨率。 - 一个引擎、串行队列;不要在主线程处理。
- 用 ARC 释放帧(
frame = nil),复用采集 buffer。 - 避免每帧
setFilter:/setSticker:。
日志
0 成功,-1 参数无效,-2 未初始化。完整列表见 错误处理。
版本
- iOS 12.0+,arm64。
- CocoaPods:
pod 'Facebetter', '2.0.0'。 - 升级后执行
pod install、Clean Build Folder,再验证授权和processImage:。
线程
- 默认引擎:所有
processImage:以及触及 GL 资源的 setter 走串行队列。 externalContext = YES:在 GL 线程创建并处理。- 仅在主队列更新 UI。

