Capturar acciones de movimiento rápido con claridad es una función clave para las apps de cámara modernas. Esto se logra a través de la captura de alta velocidad, el proceso de adquisición de 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.
Anteriormente, la implementación de 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 eres nuevo en 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 video a una velocidad de fotogramas mucho más alta que la que se reproduce. 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 de salida final sea fluido y sin interrupciones, por lo general, 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 capturan las imágenes de 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 ralentizar la velocidad de reproducción. Esto le brinda al usuario la flexibilidad de alternar entre la reproducción normal y la cámara lenta.
- Cámara lenta lista para reproducir (video recodificado): La transmisión de video de alta velocidad se procesa y se vuelve a codificar 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 un manejo especial. Si bien el video se reproduce en cámara lenta de forma predeterminada, los reproductores de video aún pueden proporcionar controles de velocidad de reproducción que le permitan al usuario aumentar la velocidad y ver el video a su velocidad original.
La API de CameraX simplifica esto, 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 en 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, lo que le indica a CameraX que cree una sesión de cámara unificada de alta velocidad. Ten en cuenta que, si bien la transmisión de VideoCapture funcionará a la alta velocidad de fotogramas configurada, el sistema de 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.
Cómo comenzar
Antes de comenzar, asegúrate de haber agregado las dependencias necesarias de CameraX 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 sujetas a cambios en versiones futuras. Para usarlas, debes habilitarlas 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. Configura 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 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. Elige tu resultado
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 (p.ej., 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 reproducir
Elige esta opción si quieres un video que 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())
Esta única marca es la clave para crear un video en cámara lenta listo para reproducir. 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 de cámara lenta se determina por la proporción de la velocidad de fotogramas de captura a esta velocidad de reproducción estándar.
Por ejemplo:
- La grabación a 120 fps producirá un video que se reproducirá a 1/4 de velocidad (120 ÷ 30 = 4).
- La grabación a 240 fps producirá un video que se reproducirá a 1/8 de velocidad (240 ÷ 30 = 8).
Revisión general: Graba el video
Una vez que hayas configurado tu HighSpeedVideoSessionConfig y la 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 el manejo de 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 manejo de 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 videos en cámara lenta
Cuando habilitas setSlowMotionEnabled(true) en CameraX, el archivo de video resultante está diseñado para ser reconocible y reproducible al instante como cámara lenta en reproductores de video estándar y apps de galería. 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 la IU distinta en la miniatura: En tu biblioteca de Google Fotos, los videos en cámara lenta se pueden identificar mediante elementos específicos de la IU, lo que los distingue de los videos normales.
- 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 archivo de video nuevo con el botón Compartir , lo que conserva los segmentos de cámara lenta que definiste.
Nota sobre la compatibilidad con dispositivos
La API de alta velocidad de CameraX se basa en el sistema CamcorderProfile de Android subyacente para determinar qué resoluciones y velocidades de fotogramas de alta velocidad admite un dispositivo. El Conjunto de pruebas de compatibilidad (CTS) de Android valida los CamcorderProfiles, lo que significa que puedes confiar en las capacidades de grabación de video informadas del dispositivo.
Esto significa que la capacidad de un dispositivo para grabar video 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 propagar las entradas CamcorderProfile en el firmware de su dispositivo 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() mostrará null.
Por lo tanto, es fundamental usar siempre Recorder.getHighSpeedVideoCapabilities() para verificar las funciones compatibles de forma programática, ya que 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() muestra un valor nulo, la operación fallará con un IllegalArgumentException. Puedes confirmar la compatibilidad en dispositivos Google Pixel, ya que incluyen estos perfiles de alta velocidad de manera coherente. Además, varios dispositivos de otros fabricantes, como Motorola Edge 30, OPPO Find N2 Flip y Sony Xperia 1 V, también admiten las capacidades de video de alta velocidad.
Conclusión
La API de video de alta velocidad de CameraX es potente y flexible. Ya sea que necesites imágenes de alta velocidad de fotogramas reales para el análisis técnico o quieras agregar efectos cinematográficos de cámara lenta 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.
Seguir leyendo
-
Cómo hacer
Ya 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 todas partes.
Adarsh Fernando, Esteban de la Canal • Lectura de 4 min
-
Cómo hacer
En reconocimiento de que el agotamiento excesivo de la batería es una prioridad para los usuarios de Android, Google ha tomado medidas significativas para ayudar a los desarrolladores a crear apps más eficientes en cuanto a la energía.
Alice Yuan • Lectura de 8 min
-
Cómo hacer
Queríamos proporcionarte ejemplos de funciones basadas en IA con modelos integrados en el dispositivo y en la nube, y motivarte a crear experiencias agradables para tus usuarios.
Thomas Ezan, Ivy Knight • Lectura de 2 min
Mantente al día
Recibe la información más reciente sobre el desarrollo de Android en tu bandeja de entrada todas las semanas.