选择 FrameType
在processImage 之前设置 ImageFrame.type。没有额外的模式参数。
FrameType.VIDEO(默认)
- 相机预览、视频通话、直播
- 延迟更低
FrameType.IMAGE
- 相册图、导出、抓拍静图
- 画质更高,单帧成本更大
相册大图(预览与导出)
高分辨率静图不要在每次拖动滑条时把原图像素送进processImage,也不要缩放后丢掉原图。
打开照片时保留完整 Bitmap,并另做一份预览帧(长边约 1280–1440)。调参时对预览帧 processImage(FrameType.IMAGE);导出时对全尺寸帧再处理一次,同一套 setter。输出尺寸等于输入帧——不要把预览结果放大当成片。摄像头预览仍用采集分辨率 + FrameType.VIDEO。
参数范围
先用较小强度确认人脸检测与帧率,再逐步加大。
实时预览示例:
setBeautySkinOnly(true)。
预设置见 参数枚举。
内存
从像素数据创建帧时请使用 DirectByteBuffer:
- 每个进程 / GL 上下文只保留一个引擎,不要每帧创建
- 交互式静图:缩放副本做预览,保留原
Bitmap供导出;见 相册大图 convert()会分配 新 帧,必须单独release()
OpenGL ES
当externalContext = true 时:
- 在已绑定上下文的 GL 线程上构造引擎
- 输入纹理、
processImage、输出纹理必须属于同一上下文 - 上下文丢失后重建引擎
- 继续走 GPU 时用
output.getTexture()取结果,不要先下载到 CPU
单引擎与 Application Context
整个应用持有一个BeautyEffectEngine。用 getApplicationContext() 避免随 Activity 销毁,会话结束时仍要 release()。
避开 UI 线程
在相机 / GL / 独立线程执行processImage,仅把结果 post 回主线程更新 UI。
ImageFrame 需要自行加锁。Demo 相机路径在渲染线程处理最新一帧。
从 assets 加载滤镜与贴纸
把.fbd 放在 assets/,传入 byte[](或拷到 filesDir 再传路径)。用户选中效果时调用一次 setFilter / setSticker,不要每帧设置。用 setFilterIntensity 调混合。
GPU 上传发生在下一次 processImage。
用 getStats 监控
avgProcessTimeMs 长期高于约 33 ms,应降低分辨率、使用 FrameType.VIDEO,或减少同时开启的整形 / 美妆 / 虚拟背景。
持久化滑杆
强度由应用自己存(SharedPreferences)。引擎创建后再用 setSmoothing、setReshape、setLipstick 等重新应用——SDK 不保存 UI 状态。
生命周期
onResume/onPause:启停相机;若马上恢复可保留引擎onDestroy/onDetach:若由该页面创建引擎,则engine.release()externalContext:在 GL 线程创建与销毁
测试
licenseToken,或可访问 /facebetter/v2/auth 且已绑定包名)。
