Guías prácticas
Captura de alta velocidad y vídeo a cámara lenta con CameraX 1.5
Lectura de 6 minutos
Capturar con claridad escenas de acción rápida es una función clave de las aplicaciones de cámara modernas. Esto se consigue mediante la captura a alta velocidad, que es el proceso de adquirir fotogramas a velocidades como 120 o 240 fps. Esta captura de alta fidelidad se puede usar con dos fines distintos: crear un vídeo con una alta frecuencia de fotogramas para hacer un análisis detallado fotograma a fotograma o generar un vídeo a cámara lenta en el que la acción se desarrolle de forma espectacular en la pantalla.
Antes, la implementación de estas funciones con la API Camera2 era un proceso más práctico. Ahora, con la nueva API de alta velocidad de CameraX 1.5, todo el proceso se simplifica, lo que te permite crear vídeos con una alta frecuencia de fotogramas o clips a cámara lenta listos para reproducir. En esta publicación te explicamos cómo dominar ambas. Si no conoces CameraX, puedes ponerte al día con la descripción general de CameraX.
El principio de la cámara lenta
El principio fundamental de la cámara lenta es grabar vídeos con una velocidad de fotogramas mucho mayor que la de reproducción. Por ejemplo, si grabas un evento de un segundo a 120 fotogramas por segundo (fps) y luego reproduces esa grabación a 30 fps, el vídeo tardará cuatro segundos en reproducirse. Este "estiramiento" del tiempo es lo que crea el espectacular efecto de cámara lenta, que te permite ver detalles que son demasiado rápidos para el ojo humano.
Para que el vídeo final sea fluido, debe renderizarse a un mínimo de 30 fps. Esto significa que, para crear un vídeo a cámara lenta con una velocidad de 4x, la velocidad de fotogramas de la grabación original debe ser de al menos 120 fps (120 fps de grabación ÷ 4 = 30 fps de reproducción).
Una vez que se ha grabado el vídeo con una frecuencia de imagen alta, hay dos formas principales de conseguir el resultado deseado:
- Cámara lenta controlada por el reproductor (vídeo de alta velocidad de fotogramas): la grabación de alta velocidad (por ejemplo, 120 fps) se guarda directamente como un archivo de vídeo de alta velocidad de fotogramas. A continuación, el reproductor de vídeo debe ralentizar la velocidad de reproducción. De esta forma, el usuario puede cambiar entre la reproducción normal y a cámara lenta.
- Vídeo en cámara lenta listo para reproducir (vídeo recodificado): el flujo de vídeo de alta velocidad se procesa y se recodifica en un archivo con una velocidad de fotogramas estándar (por ejemplo, 30 fps). El efecto de cámara lenta se aplica ajustando las marcas de tiempo de los fotogramas. El vídeo resultante se reproducirá a cámara lenta en cualquier reproductor de vídeo estándar sin necesidad de hacer nada especial. Aunque el vídeo se reproduce a cámara lenta de forma predeterminada, los reproductores de vídeo pueden seguir ofreciendo controles de velocidad de reproducción que permitan al usuario aumentar la velocidad y ver el vídeo a su velocidad original.
La API CameraX simplifica este proceso ofreciéndote una forma unificada de elegir el enfoque que quieras, como verás más abajo.
Nueva API de vídeo de alta velocidad
La nueva solución CameraX se basa en dos componentes principales:
Recorder#getHighSpeedVideoCapabilities(CameraInfo): este método te permite comprobar si la cámara puede grabar a alta velocidad y, si es así, qué resoluciones (objetosQuality) se admiten.HighSpeedVideoSessionConfig: es un objeto de configuración especial que agrupa tus casos prácticos deVideoCaptureyPreview, e indica a CameraX que cree una sesión de cámara unificada de alta velocidad. Ten en cuenta que, aunque la transmisión VideoCapture funcionará con la alta velocidad de fotogramas configurada, el sistema de la cámara suele limitar la transmisión Preview a una velocidad estándar de al menos 30 FPS para garantizar que se muestre correctamente en la pantalla.
Introducción
Antes de empezar, asegúrate de haber añadido las dependencias de CameraX necesarias al archivo build.gradle.kts de tu aplicación. Necesitarás el artefacto camera-video junto con las bibliotecas principales de CameraX.
// build.gradle.kts (Module: app) dependencies { val camerax_version = "1.5.1" implementation("androidx.camera:camera-core:$camerax_version") implementation("androidx.camera:camera-camera2:$camerax_version") implementation("androidx.camera:camera-lifecycle:$camerax_version") implementation("androidx.camera:camera-video:$camerax_version") implementation("androidx.camera:camera-view:$camerax_version") }
Nota sobre las APIs experimentales
Es importante tener en cuenta que las APIs de grabación de alta velocidad están en fase experimental. Esto significa que están sujetos a cambios en versiones futuras. Para usarlas, debe habilitarlas añadiendo la siguiente anotación a su código:
@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)
Implementación
La implementación de ambos resultados empieza con los mismos pasos de configuración. La diferencia entre crear un vídeo con una frecuencia de imagen alta o un vídeo a cámara lenta se reduce a un solo ajuste.
1. Configurar Captura de alta velocidad
En primer lugar, independientemente de tu objetivo, debes obtener el ProcessCameraProvider, comprobar las funciones del dispositivo y crear tus casos prácticos.
El siguiente bloque de código muestra el flujo de configuración completo en una función de suspensión. Puedes llamar a esta función desde un ámbito de corrutina, como lifecycleScope.launch.
// Add the OptIn annotation at the top of your function or class @kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class) private suspend fun setupCamera() { // Asynchronously get the CameraProvider val cameraProvider = ProcessCameraProvider.awaitInstance(this) // -- CHECK CAPABILITIES -- val cameraInfo = cameraProvider.getCameraInfo(CameraSelector.DEFAULT_BACK_CAMERA) val videoCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo) if (videoCapabilities == null) { // This camera device does not support high-speed video. return } // -- CREATE USE CASES -- val preview = Preview.Builder().build() // You can create a Recorder with default settings. // CameraX will automatically select a suitable quality. val recorder = Recorder.Builder().build() // Alternatively, to use a specific resolution, you can configure the // Recorder with a QualitySelector. This is useful if your app has // specific resolution requirements or you want to offer user // preferences. // To use a specific quality, you can uncomment the following lines. // Get the list of qualities supported for high-speed video. // val supportedQualities = videoCapabilities.getSupportedQualities(DynamicRange.SDR) // Build the Recorder using the quality from the supported list. // val recorderWithQuality = Recorder.Builder() // .setQualitySelector(QualitySelector.from(supportedQualities.first())) // .build() // Create the VideoCapture use case, using either recorder or recorderWithQuality val videoCapture = VideoCapture.withOutput(recorder) // Now you are ready to configure the session for your desired output... }
2. Elegir el formato de salida
Ahora, decide qué tipo de vídeo quieres crear. Este código se ejecutaría dentro de la función setupCamera() suspend que se muestra arriba.
Opción A: Crear un vídeo con una alta frecuencia de imagen
Elige esta opción si quieres que el archivo final tenga una velocidad de fotogramas alta (por ejemplo, un vídeo de 120 fps).
// Create a builder for the high-speed session val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture) .setPreview(preview) // Query and apply a supported frame rate. Common supported frame rates include 120 and 240 fps. val supportedFrameRateRanges = cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build()) sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())
Opción B: Crear un vídeo a cámara lenta listo para reproducir
Elige esta opción si quieres que un vídeo se reproduzca a cámara lenta automáticamente en cualquier reproductor de vídeo estándar.
// Create a builder for the high-speed session val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture) .setPreview(preview) // This is the key: enable automatic slow-motion! sessionConfigBuilder.setSlowMotionEnabled(true) // Query and apply a supported frame rate. Common supported frame rates include 120, 240, and 480 fps. val supportedFrameRateRanges = cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build()) sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())
Esta única marca es la clave para crear un vídeo a cámara lenta listo para reproducirse. Cuando setSlowMotionEnabled es true, CameraX procesa el flujo de alta velocidad y lo guarda como un archivo de vídeo estándar de 30 fps. La velocidad de la cámara lenta se determina en función de la relación entre la velocidad de fotogramas de captura y esta velocidad de reproducción estándar.
Por ejemplo:
- Si grabas a 120 fps, el vídeo se reproducirá a 1/4 de la velocidad (120 ÷ 30 = 4).
- Si grabas a 240 fps, el vídeo se reproducirá a 1/8 de la velocidad (240 ÷ 30 = 8).
Combinando todos los elementos: grabar el vídeo
Una vez que hayas configurado tu HighSpeedVideoSessionConfig y lo hayas vinculado al ciclo de vida, el último paso es iniciar la grabación. El proceso de preparación de las opciones de salida, el inicio de la grabación y la gestión de los eventos de vídeo es el mismo que en el caso de una grabación de vídeo estándar.
En esta entrada nos centraremos en la configuración de alta velocidad, por lo que no explicaremos el proceso de grabación en detalle. Para obtener una guía completa sobre todo lo que necesitas saber, desde cómo preparar un objeto FileOutputOptions o MediaStoreOutputOptions hasta cómo gestionar las devoluciones de llamada VideoRecordEvent, consulta la documentación de VideoCapture.
// Bind the session config to the lifecycle cameraProvider.bindToLifecycle( this as LifecycleOwner, CameraSelector.DEFAULT_BACK_CAMERA, sessionConfigBuilder.build() // Bind the config object from Option A or B ) // Start the recording using the VideoCapture use case val recording = videoCapture.output .prepareRecording(context, outputOptions) // See docs for creating outputOptions .start(ContextCompat.getMainExecutor(context)) { recordEvent -> // Handle recording events (e.g., Start, Pause, Finalize) }
Compatibilidad de Google Fotos con vídeos a cámara lenta
Cuando habilitas setSlowMotionEnabled(true) en CameraX, el archivo de vídeo resultante se ha diseñado para que se pueda reconocer y reproducir al instante como cámara lenta en reproductores de vídeo y aplicaciones de galería estándar. Google Fotos, en concreto, ofrece funciones mejoradas para estos vídeos a cámara lenta cuando la velocidad de fotogramas de captura es de 120, 240, 360, 480 o 960 fps:
- Reconocimiento de interfaz de usuario en miniaturas: en tu biblioteca de Google Fotos, los vídeos a cámara lenta se pueden identificar por elementos específicos de la interfaz de usuario, lo que los distingue de los vídeos normales.
- Segmentos de velocidad ajustables durante la reproducción: al reproducir un vídeo a cámara lenta, Google Fotos ofrece controles para ajustar qué partes del vídeo se reproducen a cámara lenta y cuáles a velocidad normal, lo que permite a los usuarios tener control creativo. A continuación, puedes exportar el vídeo editado como un nuevo archivo de vídeo con el botón Compartir, conservando los segmentos a cámara lenta que hayas definido.
Nota sobre la asistencia para dispositivos
La API de alta velocidad de CameraX se basa en el sistema CamcorderProfile de Android para determinar qué resoluciones y frecuencias de imagen de alta velocidad admite un dispositivo. La Suite de Pruebas de Compatibilidad de Android (CTS) valida los CamcorderProfiles, lo que significa que puedes confiar en las funciones de grabación de vídeo que indica el dispositivo.
Esto significa que el hecho de que un dispositivo pueda grabar vídeos a cámara lenta con su aplicación de cámara integrada no garantiza que la API de alta velocidad de CameraX funcione. Esta discrepancia se produce porque los fabricantes de dispositivos son los responsables de rellenar las entradas CamcorderProfile en el firmware de sus dispositivos y, en ocasiones, no se incluyen perfiles de alta velocidad necesarios, como CamcorderProfile.QUALITY_HIGH_SPEED_1080P y CamcorderProfile.QUALITY_HIGH_SPEED_720P. Si faltan estos perfiles, Recorder.getHighSpeedVideoCapabilities() devolverá null.
Por lo tanto, es fundamental usar siempre Recorder.getHighSpeedVideoCapabilities() para comprobar las funciones admitidas mediante programación, ya que es la forma más fiable de garantizar una experiencia coherente en diferentes dispositivos. Si intentas enlazar un HighSpeedVideoSessionConfig en un dispositivo en el que Recorder.getHighSpeedVideoCapabilities() devuelve un valor nulo, la operación fallará y se producirá un IllegalArgumentException. Puedes confirmar la compatibilidad en los dispositivos Google Pixel, ya que incluyen estos perfiles de alta velocidad de forma constante. Además, varios dispositivos de otros fabricantes, como Motorola Edge 30, OPPO Find N2 Flip y Sony Xperia 1 V, también admiten las funciones de vídeo de alta velocidad.
Conclusión
La API de vídeo de alta velocidad de CameraX es potente y flexible. Tanto si necesitas imágenes con una alta frecuencia de fotogramas para hacer análisis técnicos como si quieres añadir efectos de cámara lenta cinematográficos a tu aplicación, la HighSpeedVideoSessionConfig te ofrece una solución unificada y sencilla. Si conoces el papel de la marca setSlowMotionEnabled, puedes admitir fácilmente ambos casos prácticos y ofrecer a tus usuarios más control creativo.
Seguir leyendo
-
Instrucciones
Google es consciente de que el consumo excesivo de batería es una de las principales preocupaciones de los usuarios de Android, por lo que ha tomado medidas importantes para ayudar a los desarrolladores a crear aplicaciones más eficientes.
Alice Yuan • Lectura de 8 minutos
-
Instrucciones
Queríamos mostrarte ejemplos de funciones basadas en IA que usan modelos en el dispositivo y en la nube, así como inspirarte para que crees experiencias atractivas para tus usuarios.
Thomas Ezan, Ivy Knight • Tiempo de lectura: 2 min
-
Instrucciones
La guía de nivelación del rendimiento incluye 5 niveles. Empezaremos con el nivel 1, que incluye herramientas de rendimiento que requieren un esfuerzo mínimo de adopción, y llegaremos hasta el nivel 5, ideal para aplicaciones que tienen los recursos necesarios para mantener un marco de rendimiento personalizado.
Alice Yuan • Lectura de 9 minutos
Mantente al día
Recibe cada semana en tu bandeja de entrada las últimas novedades sobre el desarrollo para Android.