Grabación de vídeo
Capture vídeo con CameraX
Grabación de vídeo es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Android Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Android Academy incluye 4 lecciones en total.
Grabar vídeo con CameraX
CameRX graba vídeo mediante el caso de uso VideoCapture, respaldado por un Recorder. En esta lección configurará la captura de vídeo, iniciará y detendrá una grabación y la guardará en la galería, incluido el audio.
El flujo es similar al de las fotos, pero añade una sesión de Recording de larga duración que se inicia y se detiene posteriormente.
Recorder y calidad
Primero debe crear un Recorder, que define la codificación y la calidad. QualitySelector permite solicitar una calidad objetivo (por ejemplo, HD o FHD), con una alternativa si el dispositivo no puede proporcionarla.
val recorder = Recorder.Builder()
.setQualitySelector(
QualitySelector.from(
Quality.FHD,
FallbackStrategy.lowerQualityOrHigherThan(Quality.SD)
)
)
.build()Crear VideoCapture
Envuelva el Recorder en un caso de uso VideoCapture mediante la factoría withOutput. Este es el objeto que vinculará a la cámara, igual que ImageCapture.
val videoCapture = VideoCapture.withOutput(recorder)Vincular Preview + VideoCapture
Vincule la vista previa y VideoCapture. Tenga en cuenta que en muchos dispositivos no se pueden vincular ImageCapture y VideoCapture al mismo tiempo, así que elija los casos de uso que necesite la pantalla.
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
lifecycleOwner,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
videoCapture
)Permiso de audio
Para grabar sonido necesita el permiso de ejecución RECORD_AUDIO, además de CAMERA. Solicite ambos antes de iniciar una grabación y habilite el audio únicamente si el usuario lo ha concedido.
// Manifest declares both:
// <uses-permission android:name="android.permission.CAMERA" />
// <uses-permission android:name="android.permission.RECORD_AUDIO" />
val audioGranted = ContextCompat.checkSelfPermission(
context, Manifest.permission.RECORD_AUDIO
) == PackageManager.PERMISSION_GRANTEDSalida mediante MediaStore
Al igual que con las fotos, guarde el vídeo en MediaStore utilizando el almacenamiento específico de la aplicación. Cree ContentValues con un tipo MIME mp4 y cree MediaStoreOutputOptions.
val values = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, "VID_${System.currentTimeMillis()}")
put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/MyApp")
}
val outputOptions = MediaStoreOutputOptions
.Builder(context.contentResolver, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
.setContentValues(values)
.build()Iniciar una grabación
Prepare la grabación desde el recorder, habilite opcionalmente el audio con withAudioEnabled() y, después, iníciela con start(). start() devuelve un objeto Recording que debe conservar para poder detenerlo más adelante.
También debe pasar un listener que reciba actualizaciones de VideoRecordEvent.
val recording = videoCapture.output
.prepareRecording(context, outputOptions)
.apply { if (audioGranted) withAudioEnabled() }
.start(ContextCompat.getMainExecutor(context)) { event ->
when (event) {
is VideoRecordEvent.Start -> { /* recording began */ }
is VideoRecordEvent.Finalize -> {
if (!event.hasError()) {
// event.outputResults.outputUri -> saved video
}
}
}
}Responder a los eventos de grabación
El listener proporciona el ciclo de vida de la grabación:
VideoRecordEvent.Start— la grabación ha comenzado (actualice la interfaz para mostrar un botón de detención).VideoRecordEvent.Status— actualizaciones periódicas con la duración y el tamaño grabados.VideoRecordEvent.Finalize— la grabación ha terminado; compruebehasError().
is VideoRecordEvent.Status -> {
val seconds = event.recordingStats.recordedDurationNanos / 1_000_000_000
// Update an on-screen timer.
}Detener la grabación
Para finalizar, llame a stop() en el Recording que guardó anteriormente. Esto activa un evento Finalize, en el que el URI del vídeo pasa a estar disponible.
Conserve la grabación activa en el estado para que un único botón pueda alternar entre iniciar y detener.
var activeRecording: Recording? = null
// Toggle handler:
if (activeRecording == null) {
activeRecording = startRecording()
} else {
activeRecording?.stop()
activeRecording = null
}Pausar y reanudar
También puede pausar y reanudar un Recording sin detenerlo. Esto resulta útil para permitir que los usuarios unan varios clips en un solo archivo.
activeRecording?.pause()
// ...later
activeRecording?.resume()
// Final stop writes the file:
activeRecording?.stop()Interfaz de Compose para grabar
Controle la interfaz mediante el estado. Realice un seguimiento de si hay una grabación activa y cambie el icono y la acción del botón según corresponda. Como el listener se ejecuta en el executor principal, puede actualizar directamente el estado de Compose desde él.
var isRecording by remember { mutableStateOf(false) }
IconButton(onClick = { toggleRecording() }) {
Icon(
imageVector = if (isRecording) Icons.Default.Stop else Icons.Default.Videocam,
contentDescription = if (isRecording) "Stop" else "Record"
)
}Comprobación rápida
Confirme que comprende la grabación de vídeo con CameraX.
Resumen
Ya puede grabar vídeo con CameraX:
- Cree un
Recordercon unQualitySelectory envuélvalo enVideoCapture.withOutput. - Vincúlelo con la vista previa y solicite
RECORD_AUDIOpara grabar sonido. - Guarde el vídeo mediante
MediaStoreOutputOptionsy, después, useprepareRecording().start()para obtener unRecording. - Responda a los eventos de
VideoRecordEvent; llame astop()para finalizar y lea el URI guardado.
Ha completado el curso de CameraX: ya tiene a su disposición la vista previa, las fotos y el vídeo.
Preguntas frecuentes
¿La lección «Grabación de vídeo» es gratis?
Sí — el texto completo de «Grabación de vídeo» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Android Academy, actualiza a CoddyKit PRO. El curso de Android Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Grabación de vídeo»?
Capture vídeo con CameraX Practicas Android Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Android Academy?
No se requiere experiencia previa. Android Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Grabación de vídeo»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Android Academy?
Sí. Cada lección de Android Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Descripción general de CameraX
- Cómo mostrar una vista previa de la cámara
- Cómo tomar fotografías
- Grabación de vídeo