Skip to main content

Elegir FrameType

Configura ImageFrame.type antes de processImage. No hay un argumento de modo extra. FrameType.VIDEO (predeterminado)
  • Vista previa de cámara, videollamadas, streaming en directo
  • Menor latencia
FrameType.IMAGE
  • Fotos de galería, exportación, captura de estáticos
  • Mayor calidad, más coste por fotograma

Fotos grandes (vista previa y exportación)

No envíes píxeles a resolución completa a processImage en cada movimiento del deslizador, ni tires el original después de escalar. Al abrir la foto, conserva el Bitmap completo y crea un fotograma de vista previa (lado largo unos 1280–1440). Los cambios de parámetros llaman a processImage sobre la vista previa (FrameType.IMAGE). La exportación llama a processImage sobre un fotograma a resolución completa con los mismos setters. El tamaño de salida coincide con la entrada: no amplíes la vista previa. La cámara sigue en resolución de captura + FrameType.VIDEO.

Rangos de parámetros

Empieza bajo; sube cuando confirmes la detección facial y el FPS. Vista previa en directo (ejemplo):
Activa setBeautySkinOnly(true) cuando no quieras suavizado en pelo / ropa / fondo. Nombres de estilos: Enumeraciones de parámetros.

Memoria

Usa ByteBuffers directos al crear fotogramas a partir de datos de píxel:
Libera los fotogramas nativos:
  • Un motor por proceso / contexto GL; no lo crees por fotograma
  • Estáticos interactivos: escala una copia para la vista previa; conserva el Bitmap original para exportar. Véase Fotos grandes
  • convert() asigna un fotograma nuevo: libéralo

OpenGL ES

Cuando externalContext = true:
  • Construye el motor en el hilo GL con un contexto actual
  • Mantén la textura de entrada, processImage y la textura de salida en ese mismo contexto
  • Recrea el motor tras una pérdida de contexto
  • Lee el resultado con output.getTexture(), no con una descarga a CPU, si te quedas en GPU
Consulta Implementar belleza.

Un motor, contexto de aplicación

Mantén un único BeautyEffectEngine. Usa getApplicationContext() para que el motor sobreviva a una Activity, y aun así llama a release() cuando termine la sesión.
Siempre llama a release() del motor cuando termine la sesión. Los objetos ImageFrame también necesitan release().

Fuera del hilo de UI

Ejecuta processImage en un hilo de cámara / GL / dedicado. Publica resultados al looper principal solo para la UI.
No compartas un ImageFrame entre hilos sin tu propio lock. El camino de cámara del demo procesa el fotograma más reciente en el hilo de render.

Filtros y stickers desde assets

Guarda archivos .fbd en assets/ y pasa byte[] (o cópialos a filesDir y pasa una ruta). Llama a setFilter / setSticker una vez cuando el usuario elija un efecto, no en cada fotograma. Ajusta la mezcla con setFilterIntensity. La subida a GPU ocurre en el siguiente processImage.

Supervisar con getStats

Si avgProcessTimeMs se mantiene por encima de ~33 ms en una vista previa en directo a 30 FPS, baja la resolución, usa FrameType.VIDEO o reduce remodelado / maquillaje / fondo virtual simultáneos.

Persistir deslizadores del usuario

Guarda las intensidades tú mismo (SharedPreferences). Vuelve a aplicarlas con setSmoothing, setReshape, setLipstick, … después de crear el motor: el SDK no persiste el estado de la UI.

Ciclo de vida

  • onResume / onPause: inicia y detén la cámara; conserva el motor si vas a reanudar pronto
  • onDestroy / onDetach: engine.release() si este propietario lo creó
  • externalContext: crear / destruir en el hilo GL

Pruebas

Las pruebas instrumentadas necesitan una licencia válida (licenseToken o /facebetter/v2/auth accesible más un nombre de paquete vinculado).