Capturar la acción en movimiento con claridad es una función clave de las apps de cámara modernas. Esto se logra a través de la captura de alta velocidad, el proceso de adquirir fotogramas a velocidades como 120 o 240 FPS. Esta captura de alta fidelidad se puede usar para dos propósitos distintos: crear un video de alta velocidad de fotogramas para un análisis detallado fotograma por fotograma o generar un video en cámara lenta en el que la acción se desarrolla de forma dramática en la pantalla.
Antes, implementar estas funciones con la API de Camera2 era un proceso más práctico. Ahora, con la nueva API de alta velocidad en CameraX 1.5, todo el proceso se simplifica, lo que te brinda la flexibilidad de crear videos de alta velocidad de fotogramas reales o clips en cámara lenta listos para reproducir. En esta publicación, te mostraremos cómo dominar ambos. Si no conoces CameraX, puedes ponerte al día con la Descripción general de CameraX.
El principio detrás de la cámara lenta
El principio fundamental de la cámara lenta es capturar videos con una velocidad de fotogramas mucho más alta que la que se usa para reproducirlos. Por ejemplo, si grabas un evento de un segundo a 120 fotogramas por segundo (FPS) y, luego, reproduces esa grabación a 30 FPS estándar, el video tardará cuatro segundos en reproducirse. Este “estiramiento” del tiempo es lo que crea el efecto dramático de cámara lenta, lo que te permite ver detalles que son demasiado rápidos para el ojo humano.
Para garantizar que el video final sea fluido, se debe renderizar a un mínimo de 30 FPS. Esto significa que, para crear un video en cámara lenta de 4x, la velocidad de fotogramas de captura original debe ser de al menos 120 fps (120 fps de captura ÷ 4 = 30 fps de reproducción).
Una vez que se captura el video con una alta velocidad de fotogramas, existen dos formas principales de lograr el resultado deseado:
- Cámara lenta controlada por el reproductor (video de alta velocidad de fotogramas): La grabación de alta velocidad (p.ej., 120 fps) se guarda directamente como un archivo de video de alta velocidad de fotogramas. Luego, es responsabilidad del reproductor de video reducir la velocidad de reproducción. Esto le brinda al usuario la flexibilidad de alternar entre la reproducción normal y en cámara lenta.
- Video en cámara lenta listo para reproducir (video recodificado): El flujo de video de alta velocidad se procesa y se recodifica en un archivo con una velocidad de fotogramas estándar (p.ej., 30 FPS). El efecto de cámara lenta se "incorpora" ajustando las marcas de tiempo de los fotogramas. El video resultante se reproducirá en cámara lenta en cualquier reproductor de video estándar sin necesidad de un tratamiento especial. Si bien el video se reproduce en cámara lenta de forma predeterminada, los reproductores de video pueden proporcionar controles de velocidad de reproducción que permitan al usuario aumentar la velocidad y mirar el video a su velocidad original.
La API de CameraX simplifica este proceso, ya que te brinda una forma unificada de elegir el enfoque que deseas, como verás a continuación.
La nueva API de video de alta velocidad
La nueva solución de CameraX se basa en dos componentes principales:
Recorder#getHighSpeedVideoCapabilities(CameraInfo): Este método te permite verificar si la cámara puede grabar a alta velocidad y, si es así, qué resoluciones (objetosQuality) son compatibles.HighSpeedVideoSessionConfig: Es un objeto de configuración especial que agrupa tus casos de uso deVideoCaptureyPreview, y le indica a CameraX que cree una sesión de cámara de alta velocidad unificada. Ten en cuenta que, si bien la transmisión de VideoCapture funcionará con la alta velocidad de fotogramas configurada, el sistema de la cámara suele limitar la transmisión de vista previa a una velocidad estándar de al menos 30 FPS para garantizar una visualización fluida en la pantalla.
Comenzar
Antes de comenzar, asegúrate de haber agregado las dependencias de CameraX necesarias al archivo build.gradle.kts de tu app. 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 son experimentales en este momento. Esto significa que están sujetos a cambios en versiones futuras. Para usarlos, debes habilitarlos agregando la siguiente anotación a tu código:
@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)
Implementación
La implementación para ambos resultados comienza con los mismos pasos de configuración. La elección entre crear un video de alta velocidad de fotogramas o un video en cámara lenta se reduce a un solo parámetro de configuración.
1. Cómo configurar la captura de alta velocidad
Primero, independientemente de tu objetivo, debes obtener el ProcessCameraProvider, verificar las capacidades del dispositivo y crear tus casos de uso.
En el siguiente bloque de código, se muestra el flujo de configuración completo dentro de una función de suspensión. Puedes llamar a esta función desde un alcance de corrutinas, 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. Cómo elegir tu salida
Ahora, decide qué tipo de video quieres crear. Este código se ejecutaría dentro de la función setupCamera() suspend que se muestra arriba.
Opción A: Crea un video de alta velocidad de fotogramas
Elige esta opción si quieres que el archivo final tenga una alta velocidad de fotogramas (por ejemplo, un video 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: Crea un video en cámara lenta listo para reproducirse
Elige esta opción si quieres que un video se reproduzca en cámara lenta automáticamente en cualquier reproductor de video 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())
Este único parámetro es la clave para crear un video en cámara lenta listo para reproducirse. Cuando setSlowMotionEnabled es verdadero, CameraX procesa la transmisión de alta velocidad y la guarda como un archivo de video estándar de 30 FPS. La velocidad en cámara lenta se determina según la proporción entre la velocidad de fotogramas de captura y esta velocidad de reproducción estándar.
Por ejemplo:
- Grabar a 120 FPS producirá un video que se reproducirá a 1/4 de la velocidad (120 ÷ 30 = 4).
- Grabar a 240 FPS producirá un video que se reproducirá a 1/8 de la velocidad (240 ÷ 30 = 8).
Revisión general: Cómo grabar el video
Una vez que hayas configurado tu HighSpeedVideoSessionConfig y lo hayas vinculado al ciclo de vida, el paso final es iniciar la grabación. El proceso de preparación de las opciones de salida, el inicio de la grabación y el control de los eventos de video es el mismo que para una captura de video estándar.
Esta publicación se centra en la configuración de alta velocidad, por lo que no abordaremos el proceso de grabación en detalle. Para obtener una guía completa sobre todo, desde la preparación de un objeto FileOutputOptions o MediaStoreOutputOptions hasta el control de las devoluciones de llamada de 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 videos en cámara lenta
Cuando habilitas setSlowMotionEnabled(true) en CameraX, el archivo de video resultante está diseñado para que se pueda reconocer y reproducir al instante como cámara lenta en los reproductores de video y las apps de galería estándar. En particular, Google Fotos ofrece funciones mejoradas para estos videos en cámara lenta cuando la velocidad de fotogramas de captura es de 120, 240, 360, 480 o 960 FPS:
- Reconocimiento de IU distintiva en la miniatura: En tu biblioteca de Google Fotos, los videos en cámara lenta se pueden identificar por elementos específicos de la IU, lo que los distingue de los videos normales.
|
|
| Miniatura de video normal | Miniatura de video en cámara lenta |
- Segmentos de velocidad ajustables durante la reproducción: Cuando se reproduce un video en cámara lenta, Google Fotos proporciona controles para ajustar qué partes del video se reproducen a velocidad lenta y cuáles a velocidad normal, lo que les brinda a los usuarios control creativo. Luego, el video editado se puede exportar como un nuevo archivo de video con el botón Compartir, lo que conservará los segmentos en cámara lenta que definiste.
|
|
| Reproducción normal de video | Reproducción de video en cámara lenta con controles de edición |
Nota sobre la compatibilidad con dispositivos
La API de alta velocidad de CameraX se basa en el sistema CamcorderProfile subyacente de Android para determinar qué resoluciones y velocidades de fotogramas de alta velocidad admite un dispositivo. Los objetos CamcorderProfile se validan con el Conjunto de pruebas de compatibilidad (CTS) de Android, lo que significa que puedes confiar en las capacidades de grabación de video que informa el dispositivo.
Esto significa que la capacidad de un dispositivo para grabar videos en cámara lenta con su app 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 responsables de completar las entradas de CamcorderProfile en el firmware de sus dispositivos y, a veces, no se incluyen los perfiles de alta velocidad necesarios, como CamcorderProfile.QUALITY_HIGH_SPEED_1080P y CamcorderProfile.QUALITY_HIGH_SPEED_720P. Cuando faltan estos perfiles, Recorder.getHighSpeedVideoCapabilities() devolverá null.
Por lo tanto, es fundamental usar siempre Recorder.getHighSpeedVideoCapabilities() para verificar las funciones admitidas de forma programática, ya que esta es la forma más confiable de garantizar una experiencia coherente en diferentes dispositivos. Si intentas vincular un HighSpeedVideoSessionConfig en un dispositivo en el que Recorder.getHighSpeedVideoCapabilities() devuelve un valor nulo, la operación fallará con 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 el Motorola Edge 30, el OPPO Find N2 Flip y el Sony Xperia 1 V, también admiten las capacidades de video de alta velocidad.
Conclusión
La API de video en alta velocidad de CameraX es potente y flexible. Ya sea que necesites imágenes de alta velocidad de fotogramas para un análisis técnico o que quieras agregar efectos de cámara lenta cinematográficos a tu app, HighSpeedVideoSessionConfig proporciona una solución unificada y simple. Si comprendes el rol de la marca setSlowMotionEnabled, puedes admitir fácilmente ambos casos de uso y brindarles a tus usuarios más control creativo.
-
InstructivosSi bien el rendimiento de la app suele equipararse con una IU fluida y tiempos de inicio rápidos, la memoria es la base silenciosa sobre la que se construyen estas métricas visibles. No es secreto que estamos viendo un cambio en el que la memoria del dispositivo es más importante que nunca.
Alice Yuan, Ajesh Pai, Fung Lam • Lectura de 10 min -
InstructivosHoy nos complace anunciar una nueva credencial de correo electrónico verificada emitida por Google, que los desarrolladores ahora pueden recuperar directamente desde la API de Credential Manager Digital Credential de Android.
Niharika Arora, Jean-Pierre Pralle • Lectura de 3 min -
InstructivosYa sea que uses Gemini en Android Studio, Gemini CLI, Antigravity o agentes de terceros, como Claude Code o Codex, nuestro objetivo es garantizar que el desarrollo de Android de alta calidad sea posible en cualquier lugar.
Adarsh Fernando, Esteban de la Canal • Lectura de 4 min
Recibe la información más reciente sobre el desarrollo de Android en tu bandeja de entrada todas las semanas.