Skip to main content

Añadir el SDK

Método A: Maven (recomendado)

En los repositorios del build.gradle / settings.gradle del proyecto:
build.gradle del módulo:
Version Catalog (gradle/libs.versions.toml):

Método B: AAR local

Descarga el SDK desde Descargas, copia facebetter.aar a libs/ y luego:

Permisos

AndroidManifest.xml:
Solicita CAMERA en runtime en API 23+.

Imports

Logging

El logging está desactivado por defecto. Actívalo antes de new BeautyEffectEngine(...).
Llama a setLogConfig antes de construir el motor, o te perderás los logs de inicialización.

Crear el motor

Credenciales: Suscripción. Detalles de autenticación: Autenticación y licencia. Si licenseToken no está vacío, se usa (token de licencia / JSON {token} / .lic sin conexión). En caso contrario appId + appKey llaman a /facebetter/v2/auth.
El constructor no devuelve null; lanza si config no es válido. Observa EngineEventCode.INITIALIZATION_COMPLETE / INITIALIZATION_FAILED en los callbacks para el init asíncrono.

Belleza

Intensidad [0.0, 1.0]. 0 desactiva el efecto. Comprueba ErrorCode.SUCCESS (0).
Con setBeautySkinOnly(true), suavizado / blanqueamiento / nitidez / rubor se aplican solo en la piel detectada. Ropa y fondo no cambian.
Estilos: Enumeraciones de parámetros.

Remodelado

Rango [-1.0, 1.0]. 0 desactiva.
Los 26 parámetros (FACE_THINBROW_THICKNESS) y las direcciones positiva / negativa: Enumeraciones de parámetros.

Remodelado corporal

Rango [0.0, 1.0]. 0 desactiva. Registra resource_body.fbd con addResourcePack primero (no está en el AAR). Consulta Enumeraciones de parámetros y Paquetes de recursos opcionales.

Maquillaje

Configura primero la intensidad y luego el estilo y/o el color.
Listas completas de estilos: Enumeraciones de parámetros.

Fondo virtual y croma

Desenfoque (0 borra), imagen estática, o máscara de croma + relleno.
clearChromaKey() restaura la segmentación de retrato y no quita el relleno actual de desenfoque/imagen.

Filtros y stickers

Carga un .fbd desde una ruta de archivo o assets. No hay paso de registro.
Los stickers 3D necesitan el paquete opcional resource_3d.fbd (no está en el AAR). Consulta Paquetes de recursos opcionales. Regístralo desde los assets de tu app y luego aplica un sticker 3D .fbd:
Los cambios de filtro / sticker entran en vigor en el siguiente processImage.

Callbacks y estadísticas

Procesar fotogramas

Llama a ImageFrame.release() en cada fotograma que crees (y en la salida de processImage). Si lo omites, se filtra memoria nativa.
Configura ImageFrame.type a FrameType.IMAGE (estático) o FrameType.VIDEO (cámara / directo). processImage recibe solo el fotograma: no hay un argumento de modo extra.
Desde un archivo o Bitmap:
Rota / espeja antes de procesar si el sensor de la cámara está rotado:
El motor mantiene alineados los formatos de píxel de entrada y salida (NV21 in → NV21 out, RGBA in → RGBA out).
Lee píxeles con getData() / accesores planares, o convierte:

Pipeline de cámara

Típico Camera2 YUV_420_888 → motor → visualización:

Textura externa (OpenGL ES)

Crea el motor en el hilo GL con externalContext = true. Las texturas de entrada y salida deben compartir ese contexto.
Usa esto cuando ya renderizas con OpenGL ES y quieres evitar idas y vueltas por CPU.
Estado de sampler recomendado para la entrada GL_TEXTURE_2D:
Notas:
  • Textura de entrada: GL_TEXTURE_2D, normalmente RGBA; stride suele ser width * 4
  • Crea el motor de forma diferida en el primer callback GL para que el contexto esté actual
  • La textura de salida la posee el SDK; no hagas glDeleteTextures. Libera el ImageFrame
  • Si se pierde el contexto GL, release() el motor y créalo de nuevo en el nuevo contexto
  • Usa FrameType.VIDEO para pipelines GL en directo
  • Para TRTC / Agora / LiveKit y SDK similares: Integración con terceros

Ciclo de vida

Llama a engine.release() en onDestroy / onDetach. Los motores sin liberar filtran GPU y memoria nativa.

Relacionado