本文档对应 SDK 2.0.0。美妆 / 美型枚举见 参数枚举。
选择正确的帧类型
在processImage: 之前设置 FBImageFrame.type。引擎方法没有独立的处理模式参数。
FBFrameTypeVideo(1):相机预览、直播、通话,延迟更低。FBFrameTypeImage(0):静图,效果更好。
相册大图(预览与导出)
高分辨率静图不要在每次拖动滑条时把原图像素送进processImage:,也不要缩放后丢掉原图。
打开照片时保留完整 UIImage,并另做一份预览帧(长边约 1280–1440,createWithUIImage:)。调参打预览(FBFrameTypeImage);导出对全尺寸帧再处理一次,同一套 setter。输出尺寸等于输入。摄像头预览仍用采集分辨率 + FBFrameTypeVideo。
参数范围
- 美肤 / 美妆 / 滤镜强度:
[0.0, 1.0]。0关闭该项。 - 美型(
setReshape:intensity:):[-1.0, 1.0]。0关闭。正负为相反方向。
一个引擎、一条串行队列
createEngineWithConfig: 返回的是实例,不是进程级单例。每个会话保留一个引擎,并在串行队列上调用(externalContext = YES 时则在 GL 线程)。
内存
- 使用 ARC,用完将
FBImageFrame置nil。 - 相机已是 NV12 / BGRA 时,不要每帧先转成 RGBA。
- 滤镜和贴纸在下一次
processImage:(GL 线程)才创建纹理。不要每帧setFilter:/setSticker:,改强度用setFilterIntensity:。 - 用
clearFilter、clearSticker、clearVirtualBackground、clearChromaKey,不要另建引擎。
外部 OpenGL ES
应用已有 GL 上下文时:- 设置
config.externalContext = YES。 - 在该 GL 线程创建引擎。
- 用
createWithTexture:width:height:stride:包装纹理。 - 输出用
[output texture]。
用 getStats 监控
优先使用 FBEngineStats,不必自建计时器:
avgProcessTimeMs 宜低于约 33 ms。偏高则降分辨率、改用 FBFrameTypeVideo,或关掉不用的美妆 / 贴纸。
生命周期
引擎用 ViewController(或会话对象)的 strong 属性持有。会话结束在dealloc 里置 nil。在 viewWillDisappear / applicationDidEnterBackground 停止采集,从而停止调用 processImage:——没有单独的 pause API。
FBEngineCallbacks 的 block 里用 __weak,避免循环引用。
iOS 采集
- 预览多为 NV12 或 BGRA,用
createWithNV12:.../createWithBGRA:...。 - 前置摄像头:对帧
setMirror:@"horizontal"(需要先翻转像素时用mirror:)。 - 相机权限:
Info.plist的NSCameraUsageDescription。相册选图:NSPhotoLibraryUsageDescription。
测试
- 绑定测试 App 的 Bundle ID,使用真实
appId/appKey或licenseToken。占位字符串会触发授权事件1/101。 - 覆盖静图(
FBFrameTypeImage+createWithUIImage:)和实时(FBFrameTypeVideo)。 - 断言 setter 返回
FBErrorCode_Success。

