Elegir FrameType
ConfiguraImageFrame.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 aprocessImage 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):
setBeautySkinOnly(true) cuando no quieras suavizado en pelo / ropa / fondo.
Nombres de estilos: Enumeraciones de parámetros.
Memoria
UsaByteBuffers directos al crear fotogramas a partir de datos de píxel:
- Un motor por proceso / contexto GL; no lo crees por fotograma
- Estáticos interactivos: escala una copia para la vista previa; conserva el
Bitmaporiginal para exportar. Véase Fotos grandes convert()asigna un fotograma nuevo: libéralo
OpenGL ES
CuandoexternalContext = true:
- Construye el motor en el hilo GL con un contexto actual
- Mantén la textura de entrada,
processImagey 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
Un motor, contexto de aplicación
Mantén un únicoBeautyEffectEngine. Usa getApplicationContext() para que el motor sobreviva a una Activity, y aun así llama a release() cuando termine la sesión.
Fuera del hilo de UI
EjecutaprocessImage en un hilo de cámara / GL / dedicado. Publica resultados al looper principal solo para la UI.
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
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 prontoonDestroy/onDetach:engine.release()si este propietario lo creóexternalContext: crear / destruir en el hilo GL
Pruebas
licenseToken o /facebetter/v2/auth accesible más un nombre de paquete vinculado).
