Mejora tus feeds de cámara en tiempo real con la función de mejora con poca luz
Lectura de 7 min
Hace poco, compartimos cómo Instagram permitió que los usuarios tomaran fotos increíbles con poca luz usando el Modo nocturno. Esa función es perfecta para imágenes fijas, en las que hay tiempo para combinar varias exposiciones y crear una toma estática de alta calidad. Pero ¿qué sucede con los momentos que ocurren entre las fotos? Los usuarios necesitan interactuar con la cámara más allá del momento en que se presiona el botón del obturador. También usan la vista previa para componer su escena o escanear códigos QR.
Hoy, analizaremos la Mejora con poca luz (LLB), una potente función diseñada para iluminar las transmisiones de la cámara en tiempo real. A diferencia del modo nocturno, que requiere que mantengas el dispositivo quieto durante la captura, la función de optimización con poca luz funciona de forma instantánea en la vista previa en vivo y en las grabaciones de video. La LLB ajusta automáticamente la cantidad de brillo necesaria según la luz disponible, por lo que se optimiza para cada entorno.
Con una actualización reciente, LLB permite que los usuarios de Instagram alineen la toma perfecta y, luego, su implementación existente del modo nocturno genera las mismas fotos de alta calidad con poca luz que sus usuarios disfrutan desde hace más de un año.
Por qué es importante el brillo en tiempo real
Mientras que el modo nocturno tiene como objetivo mejorar la calidad de la imagen final, la función de mejora con poca luz está pensada para la usabilidad y la interactividad en entornos oscuros. Otro factor importante que se debe tener en cuenta es que, aunque funcionan muy bien juntos, puedes usar LLB y el modo nocturno de forma independiente. Como verás en algunos de estos casos de uso, LLB tiene valor por sí solo cuando no se necesitan fotos en modo nocturno. A continuación, se indica cómo la LLB mejora la experiencia del usuario:
- Mejor encuadre y captura: En escenas con poca luz, la vista previa de una cámara estándar puede ser completamente oscura. LLB ilumina el visor, lo que permite que los usuarios vean lo que están encuadrando antes de presionar el botón del obturador. Para esta experiencia, puedes usar el Modo nocturno para obtener el resultado de foto con poca luz de mejor calidad, o puedes dejar que el LLB le dé al usuario un resultado de foto de “lo que ves es lo que obtienes”.
- Escaneo confiable: Los códigos QR están en todas partes, pero escanearlos en un restaurante o estacionamiento oscuro suele ser frustrante. Con un feed de la cámara mucho más brillante, los algoritmos de escaneo pueden detectar y decodificar códigos QR de forma confiable, incluso en entornos muy oscuros.
- Interacciones mejoradas: En el caso de las apps que involucran interacciones de video en vivo (como asistentes de IA o videollamadas), el LLB aumenta la cantidad de información perceptible, lo que garantiza que los modelos de visión artificial tengan suficientes datos para trabajar.
La diferencia en Instagram
El equipo de ingeniería detrás de la app de Instagram para Android siempre trabaja arduamente para brindar una experiencia de cámara de estado del arte a sus usuarios. En el ejemplo anterior, puedes ver la diferencia que hace la LLB en un Pixel 10 Pro.
Es fácil imaginar la diferencia que esto genera en la experiencia del usuario. Si los usuarios no pueden ver lo que están capturando, es más probable que abandonen la captura.
Elige tu implementación
Existen dos formas de implementar la función de mejora con poca luz para brindar la mejor experiencia en la más amplia variedad de dispositivos:
- Modo de AE de mejora con poca luz: Es un modo de exposición automática de la capa de hardware. Ofrece la mayor calidad y el mejor rendimiento, ya que ajusta directamente la canalización del procesador de señales de imagen (ISP). Siempre verifica esto primero.
- Mejorar con poca luz de Google: Si el dispositivo no admite el modo AE, puedes recurrir a esta solución basada en software que proporcionan los Servicios de Google Play. Aplica un procesamiento posterior a la transmisión de la cámara para aumentar el brillo. Como solución de software, está disponible en más dispositivos, por lo que esta implementación te ayuda a llegar a más dispositivos con LLB.
Modo de AE de mejora con poca luz (hardware)
Mecanismo:
Este modo es compatible con dispositivos que ejecutan Android 15 y versiones posteriores, y requiere que el OEM haya implementado la compatibilidad en HAL (actualmente disponible en dispositivos Pixel 10). Se integra directamente con el procesador de señales de imagen (ISP) de la cámara. Si configuras CaptureRequest.CONTROL_AE_MODE como CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY, el sistema de la cámara toma el control.
Comportamiento:
La HAL o el ISP analizan la escena y ajustan los parámetros del sensor y del procesamiento, lo que suele incluir aumentar el tiempo de exposición para iluminar la imagen. Esto puede producir fotogramas con una relación señal-ruido (SNR) significativamente mejorada, ya que el tiempo de exposición extendido, en lugar de un aumento en la ganancia del sensor digital (ISO), permite que el sensor capture más información de luz.
Ventaja:
Potencialmente, mejor calidad de imagen y eficiencia energética, ya que aprovecha las rutas de hardware dedicadas.
Compensación:
Puede provocar una velocidad de fotogramas más baja en condiciones de mucha oscuridad, ya que el sensor necesita más tiempo para capturar la luz. La velocidad de fotogramas puede bajar hasta 10 FPS en condiciones de muy poca luz.
Mejora de iluminación de Google (software a través de los Servicios de Google Play)
Mecanismo:
Esta solución, que se distribuye como un módulo opcional a través de los Servicios de Google Play, aplica un procesamiento posterior a la transmisión de la cámara. Usa una tecnología sofisticada de mejora de imágenes en tiempo real llamada HDRNet.
Google HDRNet:
Este modelo de aprendizaje profundo analiza la imagen con una resolución más baja para predecir un conjunto compacto de parámetros (una cuadrícula bilateral). Luego, esta cuadrícula guía la mejora eficiente y con variación espacial de la imagen de resolución completa en la GPU. El modelo se entrena para iluminar y mejorar la calidad de la imagen en condiciones de poca luz, con un enfoque en la visibilidad del rostro.
Organización del proceso:
El procesador de Iluminación de noche organiza el modelo HDRNet y su lógica complementaria. Esto incluye lo siguiente:
- Análisis de escenas:
Es una calculadora personalizada que estima el brillo real de la escena con los metadatos de la cámara (sensibilidad del sensor, tiempo de exposición, etc.) y el contenido de la imagen. Este análisis determina el nivel de amplificación. - Procesamiento de HDRNet:
Aplica el modelo de HDRNet para iluminar el fotograma. El modelo que se usa está ajustado para escenas con poca luz y optimizado para el rendimiento en tiempo real. - Combinación:
Se combinan los fotogramas originales y los procesados por HDRNet. La cantidad de fusión aplicada se controla de forma dinámica con la calculadora de brillo de la escena, lo que garantiza una transición fluida entre los estados mejorados y no mejorados.
Ventaja:
Funciona en una gama más amplia de dispositivos (actualmente, admite Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra y Pixel 6 a Pixel 9) sin requerir compatibilidad específica con HAL. Mantiene la velocidad de fotogramas de la cámara, ya que es un efecto de procesamiento posterior.
Compensación:
Como método de procesamiento posterior, la calidad está limitada por la información presente en los fotogramas que entrega el sensor. No puede recuperar los detalles que se pierden debido a la oscuridad extrema a nivel del sensor.
Al ofrecer rutas de hardware y software, la función de mejora con poca luz proporciona una solución escalable para mejorar el rendimiento de la cámara con poca luz en todo el ecosistema Android. Los desarrolladores deben priorizar el modo AE cuando esté disponible y usar la función de Google para mejorar la iluminación como un resguardo sólido.
Cómo implementar la Mejora con poca luz en tu app
Ahora veamos cómo implementar ambas ofertas de LLB. Puedes implementar lo siguiente, ya sea que uses CameraX o Camera2 en tu app. Para obtener los mejores resultados, te recomendamos que implementes el paso 1 y el paso 2.
Paso 1: Modo de AE de mejora con poca luz
Disponible en dispositivos seleccionados que ejecutan Android 15 y versiones posteriores, el modo LLB AE funciona como un modo de exposición automática (AE) específico.
1. Cómo comprobar la disponibilidad
Primero, verifica si el dispositivo de la cámara admite el modo de AE de LLB.
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector) val isLlbSupported = cameraInfo.isLowLightBoostSupported
2. Habilita el modo
Si es compatible, puedes habilitar el modo AE de LLB con el objeto CameraControl de CameraX.
// After setting up your camera, use the CameraInfo object to enable LLB AE Mode.
camera = cameraProvider.bindToLifecycle(...)
if (isLlbSupported) {
try {
// The .await() extension suspends the coroutine until the
// ListenableFuture completes. If the operation fails, it throws
// an exception which we catch below.
camera?.cameraControl.enableLowLightBoostAsync(true).await()
} catch (e: IllegalStateException) {
Log.e(TAG, "Failed to enable low light boost: not available on this device or with the current camera configuration", e)
} catch (e: CameraControl.OperationCanceledException) {
Log.e(TAG, "Failed to enable low light boost: camera is closed or value has changed", e)
}
}3. Supervisa el estado
Solo porque hayas solicitado el modo, no significa que esté "potenciando" el rendimiento en ese momento. El sistema solo activa la mejora cuando la escena está realmente oscura. Puedes configurar un Observer para actualizar tu IU (como mostrar un ícono de luna) o convertirla en un Flow con la función de extensión asFlow().
if (isLlbSupported) {
camera?.cameraInfo.lowLightBoostState.asFlow().collectLatest { state ->
// Update UI accordingly
updateMoonIcon(state == LowLightBoostState.ACTIVE)
}
}Puedes leer la guía completa sobre el modo de AE de Optimización con poca luz aquí.
Paso 2: Optimización de video con poca luz de Google
En los dispositivos que no admiten el modo de AE de hardware, la función de Google para mejorar la iluminación actúa como un potente resguardo. Usa una LowLightBoostSession para interceptar y aumentar el brillo de la transmisión.
1. Agregar dependencias
Esta función se ofrece a través de los Servicios de Google Play.
implementation("com.google.android.gms:play-services-camera-low-light-boost:16.0.1-beta06")
// Add coroutines-play-services to simplify Task APIs
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2")2. Inicializa el cliente
Antes de iniciar la cámara, usa LowLightBoostClient para asegurarte de que el módulo esté instalado y de que el dispositivo sea compatible.
val llbClient = LowLightBoost.getClient(context)
// Check support and install if necessary
val isSupported = llbClient.isCameraSupported(cameraId).await()
val isInstalled = llbClient.isModuleInstalled().await()
if (isSupported && !isInstalled) {
// Trigger installation
llbClient.installModule(installCallback).await()
}3. Crea una sesión de LLB
Google LLB procesa cada fotograma, por lo que debes proporcionar tu Surface de visualización a LowLightBoostSession, que te devolverá una Surface con el brillo aplicado. En el caso de las apps de Camera2, puedes agregar la Surface resultante con CaptureRequest.Builder.addTarget(). En el caso de CameraX, esta canalización de procesamiento se alinea mejor con la clase CameraEffect, en la que puedes aplicar el efecto con un SurfaceProcessor y volver a proporcionarlo a tu vista previa con un SurfaceProvider, como se ve en este código.
// With a SurfaceOutput from SurfaceProcessor.onSurfaceOutput() and a
// SurfaceRequest from Preview.SurfaceProvider.onSurfaceRequested(),
// create a LLB Session.
suspend fun createLlbSession(surfaceRequest: SurfaceRequest, outputSurfaceForLlb: Surface) {
// 1. Create the LLB Session configuration
val options = LowLightBoostOptions(
outputSurfaceForLlb,
cameraId,
surfaceRequest.resolution.width,
surfaceRequest.resolution.height,
true // Start enabled
)
// 2. Create the session.
val llbSession = llbClient.createSession(options, callback).await()
// 3. Get the surface to use.
val llbInputSurface = llbSession.getCameraSurface()
// 4. Provide the surface to the CameraX Preview UseCase.
surfaceRequest.provideSurface(llbInputSurface, executor, resultListener)
// 5. Set the scene detector callback to monitor how much boost is being applied.
val onSceneBrightnessChanged = object : SceneDetectorCallback {
override fun onSceneBrightnessChanged(
session: LowLightBoostSession,
boostStrength: Float
) {
// Monitor the boostStrength from 0 (no boosting) to 1 (maximum boosting)
}
}
llbSession.setSceneDetectorCallback(onSceneBrightnessChanged, null)
}4. Pasa los metadatos
Para que el algoritmo funcione, debe analizar el estado de exposición automática de la cámara. Debes pasar los resultados de la captura de vuelta a la sesión de LLB. En CameraX, esto se puede hacer extendiendo tu Preview.Builder con Camera2Interop.Extender.setSessionCaptureCallback().
Camera2Interop.Extender(previewBuilder).setSessionCaptureCallback(
object : CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(
session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult
) {
super.onCaptureCompleted(session, request, result)
llbSession?.processCaptureResult(result)
}
}
)Puedes encontrar los pasos detallados de implementación para el cliente y la sesión en la guía de Google Low Light Boost.
Próximos pasos
Si implementas estas dos opciones, te aseguras de que los usuarios puedan ver con claridad, escanear de forma confiable y, además, interactuar de manera eficaz, independientemente de las condiciones de iluminación.
Para ver estas funciones en acción dentro de una base de código completa y lista para producción, consulta la app de Jetpack Camera en GitHub. Implementa el modo AE de LLB y Google LLB, lo que te brinda una referencia para tu propia integración.
-
Novedades de productosLas apps que se orienten a la próxima versión de Android ya no podrán escribir directamente en los contactos con el permiso WRITE_CONTACTS.
Roxanna Aliabadi Walker • Lectura de 6 min -
Novedades de productosA medida que se acelera el desarrollo basado en agentes, la ingeniería de Android alcanza una nueva y emocionante frontera: pasar de la finalización de código asistida a agentes que ejecutan tareas de extremo a extremo bajo tu dirección. Tienes total libertad y flexibilidad para elegir los modelos y agentes que usas.
Jason Buchel • Lectura de 3 min -
Novedades de productosHoy, compartimos cómo estamos llevando nuestra visión de “más que una tienda” al siguiente nivel. Desde la pestaña Tú, que ahora es la base personal de más de 250 millones de usuarios activos por mes, hasta nuestra plataforma de juegos unificada que conecta a más de 700 millones de perfiles de gamer, Google Play llega a los usuarios dondequiera que estén.
Paul Feng • Lectura de 3 min
Recibe la información más reciente sobre el desarrollo de Android en tu bandeja de entrada todas las semanas.