Novedades de productos
Ilumina las transmisiones de tu cámara en tiempo real con la función de mejora con poca luz
Lectura de 7 minutos
Hace poco, compartimos cómo Instagram permite a los usuarios hacer fotos increíbles en condiciones de poca luz con el modo Noche. Esta función es perfecta para imágenes estáticas, en las que hay tiempo para combinar varias exposiciones y crear una toma estática de alta calidad. Pero ¿qué ocurre con los momentos que se dan entre las fotos? Los usuarios deben interactuar con la cámara más allá del momento en que se pulsa el botón del obturador. También usan la vista previa para componer la escena o escanear códigos QR.
Hoy vamos a hablar de 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 Noche, que requiere un tiempo de exposición, la función de mejora con poca luz funciona al instante en la vista previa en directo y en las grabaciones de vídeo. La función de iluminación de larga exposición ajusta automáticamente la cantidad de brillo necesaria en función de la luz disponible, por lo que está optimizada para cualquier entorno.
Con una actualización reciente, la función de poca luz permite a los usuarios de Instagram alinear la toma perfecta y, después, la implementación del modo Noche da como resultado las mismas fotos de alta calidad en condiciones de poca luz que los usuarios han disfrutado durante más de un año.
Por qué es importante el brillo en tiempo real
Aunque el modo Noche tiene como objetivo mejorar la calidad de la imagen final, la función Poca luz está pensada para mejorar la usabilidad y la interactividad en entornos oscuros. Otro factor importante que debes tener en cuenta es que, aunque funcionan muy bien juntos, puedes usar la función de larga exposición y el modo Noche de forma independiente. Como verás en algunos de estos casos prácticos, la función de larga exposición tiene valor por sí sola cuando no se necesitan fotos en modo Noche. Así es como LLB mejora la experiencia de usuario:
- Mejor encuadre y captura: en escenas con poca luz, la vista previa de una cámara estándar puede ser completamente negra. Esta función ilumina el visor, lo que permite a los usuarios ver lo que están encuadrando antes de pulsar el botón del obturador. Para disfrutar de esta experiencia, puedes usar el modo Noche para obtener la mejor calidad en fotos con poca luz o dejar que la función de poca luz te proporcione una foto que se corresponda con lo que ves.
- Escaneo fiable: los códigos QR están por todas partes, pero escanearlos en un restaurante oscuro o en un aparcamiento suele ser frustrante. Gracias al feed de la cámara, que es mucho más brillante, los algoritmos de escaneo pueden detectar y decodificar códigos QR de forma fiable incluso en entornos muy oscuros.
- Interacciones mejoradas: en las aplicaciones que implican interacciones de vídeo en directo (como asistentes de IA o videollamadas), LLB aumenta la cantidad de información perceptible, lo que asegura que los modelos de visión artificial tengan suficientes datos para funcionar.
Diferencias en Instagram
El equipo de ingeniería que está detrás de la aplicación Instagram para Android trabaja constantemente para ofrecer a sus usuarios una experiencia de cámara de vanguardia. En el ejemplo anterior, puedes ver la diferencia que supone la LLB en un Pixel 10 Pro.
Es fácil imaginar la diferencia que supone en la experiencia de usuario. Si los usuarios no pueden ver lo que están grabando, es más probable que abandonen la grabación.
Elegir la implementación
Hay dos formas de implementar el modo de poca luz para ofrecer la mejor experiencia en la mayor variedad de dispositivos posible:
- Modo AE con mejora de poca luz: se trata de un modo de exposición automática de la capa de hardware. Ofrece la máxima calidad y rendimiento porque ajusta la canalización del procesador de señal de imagen (ISP) directamente. Comprueba siempre este aspecto en primer lugar.
- Bajo luz de Google: si el dispositivo no admite el modo AE, puedes usar esta solución basada en software que proporcionan los servicios de Google Play. Aplica un posprocesamiento al flujo de la cámara para iluminarlo. Como es una solución totalmente basada en software, está disponible en más dispositivos, por lo que esta implementación te ayuda a llegar a más dispositivos con LLB.
Modo AE de Low Light Boost (hardware)
Mecanismo:
Este modo es compatible con dispositivos que tengan Android 15 o versiones posteriores, y requiere que el fabricante 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 asignas el valor CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY a CaptureRequest.CONTROL_AE_MODE, el sistema de la cámara tomará el control.
Comportamiento:
el HAL o ISP analiza la escena y ajusta los parámetros del sensor y del procesamiento, lo que a menudo incluye aumentar el tiempo de exposición para iluminar la imagen.De esta forma, se pueden obtener fotogramas con una relación señal/ruido (SNR) significativamente mejorada, ya que el tiempo de exposición prolongado, en lugar de un aumento de la ganancia del sensor digital (ISO), permite que el sensor capture más información sobre la luz.
Ventaja:
puede ofrecer una mejor calidad de imagen y eficiencia energética, ya que aprovecha las rutas de hardware específicas.
Compromiso:
puede dar lugar a una velocidad de fotogramas más baja en condiciones de mucha oscuridad, ya que el sensor necesita más tiempo para captar la luz. La velocidad de fotogramas puede descender hasta 10 FPS en condiciones de muy poca luz.
Corrección de poca luz de Google (software a través de los Servicios de Google Play)
Mecanismo:
esta solución, distribuida como un módulo opcional a través de Servicios de Google Play, aplica un posprocesamiento al flujo de la cámara. Utiliza una sofisticada tecnología de mejora de imagen en tiempo real llamada HDRNet.
Google HDRNet:
este modelo de aprendizaje profundo analiza la imagen a una resolución más baja para predecir un conjunto compacto de parámetros (una cuadrícula bilateral). Esta cuadrícula guía la mejora eficiente y espacialmente variable de la imagen a resolución completa en la GPU. El modelo se entrena para iluminar y mejorar la calidad de las imágenes en condiciones de poca luz, centrándose en la visibilidad de los rostros.
Orquestación de procesos:
el modelo HDRNet y su lógica se orquestan mediante el procesador de mejora con poca luz. Esto incluye lo siguiente:
- Análisis de la escena:
una calculadora personalizada que estima el brillo real de la escena mediante 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 impulso. - Procesamiento de HDRNet:
aplica el modelo HDRNet para iluminar el fotograma. El modelo utilizado se ha ajustado para escenas con poca luz y se ha optimizado para ofrecer un rendimiento en tiempo real. - Combinación:
los fotogramas originales y los procesados con HDRNet se combinan. La cantidad de mezcla aplicada se controla dinámicamente mediante la calculadora de brillo de la escena, lo que asegura una transición fluida entre los estados con y sin aumento.
Ventaja:
funciona en una gama más amplia de dispositivos (actualmente es compatible con Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra y Pixel 6 a Pixel 9) sin necesidad de una compatibilidad específica con HAL. Mantiene la velocidad de fotogramas de la cámara, ya que es un efecto de posprocesamiento.
Compromiso:
como método de posprocesamiento, la calidad está limitada por la información presente en los fotogramas proporcionados por el sensor. No puede recuperar los detalles que se hayan perdido debido a la oscuridad extrema a nivel del sensor.
Al ofrecer tanto hardware como software, el modo de poca luz proporciona una solución escalable para mejorar el rendimiento de la cámara en condiciones de poca luz en todo el ecosistema Android. Los desarrolladores deben priorizar el modo AE cuando esté disponible y usar la función de mejora con poca luz de Google como alternativa fiable.
Implementar la función de corrección de poca luz en tu aplicación
Ahora vamos a ver cómo implementar ambas ofertas de LLB. Puedes implementar lo siguiente tanto si usas CameraX como Camera2 en tu aplicación. Para obtener los mejores resultados, te recomendamos que implementes los pasos 1 y 2.
Paso 1: Modo AE de Poca luz
Disponible en determinados dispositivos con Android 15 y versiones posteriores, el modo AE de LLB funciona como un modo de exposición automática (AE) específico.
1. Comprobar disponibilidad
Primero, comprueba si el dispositivo de cámara es compatible con el modo AE de LLB.
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector) val isLlbSupported = cameraInfo.isLowLightBoostSupported
2. Habilitar 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. Monitorizar el estado
El hecho de que hayas solicitado el modo no significa que esté activado. El sistema solo activa el aumento cuando la escena está realmente oscura. Puedes configurar un Observer para actualizar tu interfaz de usuario (por ejemplo, mostrar un icono de luna) o convertirlo en un flujo con la función de extensión asFlow().
if (isLlbSupported) {
camera?.cameraInfo.lowLightBoostState.asFlow().collectLatest { state ->
// Update UI accordingly
updateMoonIcon(state == LowLightBoostState.ACTIVE)
}
}Puedes consultar la guía completa sobre el modo AE de Low Light Boost.
Paso 2: Google Low Light Boost
En los dispositivos que no admiten el modo AE de hardware, la función de mejora con poca luz de Google actúa como una alternativa eficaz. Usa LowLightBoostSession para interceptar y aclarar el flujo.
1. Añadir dependencias
Esta función se ofrece a través de 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. Inicializar 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. Crear una sesión de LLB
Google LLB procesa cada fotograma, por lo que debes proporcionar tu superficie de visualización a LowLightBoostSession, que te devolverá una superficie a la que se le ha aplicado el brillo. En el caso de las aplicaciones Camera2, puedes añadir la superficie resultante con CaptureRequest.Builder.addTarget(). En el caso de CameraX, esta canalización de procesamiento se adapta mejor a la clase CameraEffect, donde puedes aplicar el efecto con SurfaceProcessor y devolverlo a tu vista previa con SurfaceProvider, como se muestra 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. Transferir los metadatos
Para que el algoritmo funcione, debe analizar el estado de exposición automática de la cámara. Debes devolver los resultados de la captura a la sesión de LLB. En CameraX, esto se puede hacer ampliando 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 consultar los pasos detallados para implementar el cliente y la sesión en la guía de Low Light Boost de Google.
Pasos siguientes
Si implementas estas dos opciones, te asegurarás de que tus usuarios puedan ver con claridad, escanear de forma fiable e interactuar de forma eficaz, independientemente de las condiciones de iluminación.
Para ver estas funciones en acción en una base de código completa y lista para producción, consulta la aplicación de cámara Jetpack en GitHub. Implementa tanto el modo AE de LLB como Google LLB, lo que te proporciona una referencia para tu propia integración.
Seguir leyendo
-
Noticias sobre productos
Nos complace anunciar importantes actualizaciones de nuestros recursos de diseño, que te ofrecen la guía completa que necesitas para crear aplicaciones Android adaptables y de alta calidad en todos los factores de forma. Ahora tenemos una guía sobre la experiencia de escritorio y una galería de diseño de Android renovada.
Ivy Knight • Tiempo de lectura: 2 min
-
Noticias sobre productos
Se ha lanzado la primera versión alfa de Room 3.0. Room 3.0 es una versión principal de la biblioteca que introduce cambios importantes y se centra en Kotlin Multiplatform (KMP). Además, añade compatibilidad con JavaScript y WebAssembly (WASM) a la compatibilidad con Android, iOS y JVM para ordenadores.
Daniel Santiago Rivera • Tiempo de lectura: 4 min
-
Noticias sobre productos
Hoy nos complace compartir cómo estamos incorporando la optimización automática dirigida por comentarios (AutoFDO) al kernel de Android para ofrecer a los usuarios mejoras significativas en el rendimiento.
Yabin Cui • Tiempo de lectura: 4 min
Mantente al día
Recibe cada semana en tu bandeja de entrada las últimas novedades sobre el desarrollo para Android.