Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.
Cómo grabar un video con audio y límite de tiempo
Propósito. Grabar un video con la cámara del dispositivo, opcionalmente con audio, limitando la
duración y eligiendo la calidad, y recibir la ruta del archivo .mp4.
APIs usadas
Camera.captureMode(Preview) — modo de captura:PHOTO,MUTED_VIDEO(video sin sonido),AUDIO_VIDEO(video + audio).Camera.videoTimeLimit(int) — límite de grabación en segundos;0= sin límite.Camera.videoQuality(AVQuality) —HIGH,MEDIUM(default deCamera),LOW. Cada valor define fps, tasa de video/audio y estéreo.Camera.shot()→String— inicia la UI de grabación y devuelve la ruta del.mp4(onull).PhotoPicker(Preview type)— UI usada cuandocameraType == PICKER; tiene los campos públicosvideoTimeLimityvideoQualityqueshot()ya rellena a partir delCamera.
Nota. En el
PhotoPicker, al grabar video, el archivo se guarda en/sdcard/<timestamp>.mp4. ElvideoTimeLimithace que la etiqueta de tiempo del picker cuente de forma regresiva. EnAUDIO_VIDEOla grabación incluye audio (GdxRecorder.startVideoWithAudio), enMUTED_VIDEOno. En iOS con modo de video,shot()usa la cámara nativa del SO pasandovideoTimeLimit/videoQuality.
Ejemplo completo (copiar, pegar y ejecutar)
package com.exemplo;
import dev.crossfly.ui.*; // Window, Component, Button, Label, UIConstants
import dev.crossfly.ui.layout.*; // VerticalLayout
import dev.crossfly.device.*; // Camera, Camera.AVQuality
/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
Label resultado = new Label("");
add(LAY_AUTO, resultado);
Button acao = new Button("Gravar vídeo");
acao.onAction(c ->
{
new Thread(() ->
{
Camera cam = new Camera();
cam.cameraType = UIConstants.CameraType.PICKER; // UI de grabación de CrossFly
cam.captureMode = UIConstants.Preview.AUDIO_VIDEO; // vídeo CON audio (usa MUTED_VIDEO p/ sin sonido)
cam.videoQuality = Camera.AVQuality.HIGH; // HIGH | MEDIUM | LOW
cam.videoTimeLimit = 30; // 30s; 0 = sin límite
String mp4 = cam.shot(); // ruta del .mp4, o null si se canceló
Component.onUI(() -> // retorno fuera de la paint thread
resultado.setText(mp4 != null ? "Vídeo: " + mp4 : "Cancelado"));
}).start();
});
add(LAY_AUTO, acao);
}
}
El fragmento de abajo muestra solo el núcleo. Para ejecutarlo, colócalo en el esqueleto
MainWindowde arriba.
Fragmento mínimo
// verificado en la fuente: Camera.java (captureMode/videoTimeLimit/videoQuality, shot()); PhotoPicker.java (startRecording, stopRecording)
import dev.crossfly.device.*; // Camera, Camera.AVQuality
import dev.crossfly.ui.*; // Component, UIConstants.CameraType/Preview
new Thread(() -> {
Camera cam = new Camera();
cam.cameraType = UIConstants.CameraType.PICKER; // UI de grabación de CrossFly
cam.captureMode = UIConstants.Preview.AUDIO_VIDEO; // vídeo CON audio (usa MUTED_VIDEO p/ sin sonido)
cam.videoQuality = Camera.AVQuality.HIGH; // HIGH | MEDIUM | LOW
cam.videoTimeLimit = 30; // 30s; 0 = sin límite
String mp4 = cam.shot(); // ruta del .mp4, o null si se canceló
Component.onUI(() -> { // retorno fuera de la paint thread
if (mp4 != null)
usarVideo(mp4);
});
}).start();
Profundiza
- Guía de la cámara: Cámara del dispositivo · Widget: PhotoPicker
- Receta hermana: tirar-foto.md