跳转到主要内容

选择 FrameType

在 processImage 之前设置 ImageFrame.type。没有额外的模式参数。 FrameType.VIDEO(默认)
  • 相机预览、视频通话、直播
  • 延迟更低
FrameType.IMAGE
  • 相册图、导出、抓拍静图
  • 画质更高,单帧成本更大

相册大图(预览与导出)

高分辨率静图不要在每次拖动滑条时把原图像素送进 processImage,也不要缩放后丢掉原图。 打开照片时保留完整 Bitmap,并另做一份预览帧(长边约 1280–1440)。调参时对预览帧 processImage(FrameType.IMAGE);导出时对全尺寸帧再处理一次,同一套 setter。输出尺寸等于输入帧——不要把预览结果放大当成片。摄像头预览仍用采集分辨率 + FrameType.VIDEO。

参数范围

先用较小强度确认人脸检测与帧率,再逐步加大。 实时预览示例:
不希望磨皮作用到头发 / 衣服 / 背景时,打开 setBeautySkinOnly(true)。 预设置见 参数枚举。

内存

从像素数据创建帧时请使用 Direct ByteBuffer:
及时释放原生帧:
  • 每个进程 / GL 上下文只保留一个引擎,不要每帧创建
  • 交互式静图:缩放副本做预览,保留原 Bitmap 供导出;见 相册大图
  • convert() 会分配 新 帧,必须单独 release()

OpenGL ES

当 externalContext = true 时:
  • 在已绑定上下文的 GL 线程上构造引擎
  • 输入纹理、processImage、输出纹理必须属于同一上下文
  • 上下文丢失后重建引擎
  • 继续走 GPU 时用 output.getTexture() 取结果,不要先下载到 CPU
详见 实现美颜。

单引擎与 Application Context

整个应用持有一个 BeautyEffectEngine。用 getApplicationContext() 避免随 Activity 销毁,会话结束时仍要 release()。
会话结束必须 release() 引擎。ImageFrame 用完同样要 release()。

避开 UI 线程

在相机 / GL / 独立线程执行 processImage,仅把结果 post 回主线程更新 UI。
跨线程共享同一 ImageFrame 需要自行加锁。Demo 相机路径在渲染线程处理最新一帧。

从 assets 加载滤镜与贴纸

把 .fbd 放在 assets/,传入 byte[](或拷到 filesDir 再传路径)。用户选中效果时调用一次 setFilter / setSticker,不要每帧设置。用 setFilterIntensity 调混合。 GPU 上传发生在下一次 processImage。

用 getStats 监控

若 30 FPS 预览下 avgProcessTimeMs 长期高于约 33 ms,应降低分辨率、使用 FrameType.VIDEO,或减少同时开启的整形 / 美妆 / 虚拟背景。

持久化滑杆

强度由应用自己存(SharedPreferences)。引擎创建后再用 setSmoothing、setReshape、setLipstick 等重新应用——SDK 不保存 UI 状态。

生命周期

  • onResume / onPause:启停相机;若马上恢复可保留引擎
  • onDestroy / onDetach:若由该页面创建引擎,则 engine.release()
  • externalContext:在 GL 线程创建与销毁

测试

仪器测试需要有效授权(licenseToken,或可访问 /facebetter/v2/auth 且已绑定包名)。