Extraer un fotograma de vídeo en Android: tiempo solicitado frente a frame real
Cuando un usuario selecciona «2,5 segundos» en un vídeo, el decodificador no tiene por qué devolver exactamente la misma imagen en todos los dispositivos. El contenedor, los keyframes y el códec afectan a la búsqueda temporal.
El problema y el alcance del ejemplo
La ficha de Video to Photo: Extraer Fotos resume su función así: «Extrae fotos de tus vídeos: fotogramas individuales o en serie.» Video to Photo ofrece extracción manual y por intervalos de fotogramas según Google Play. En este ejemplo estudiaremos MediaMetadataRetriever y la decisión entre fotograma cercano y fotograma de sincronización; no asumimos que la app use esta API internamente.
Cómo reproducir la idea
En un proyecto Android con Kotlin, selecciona un vídeo local usando el selector del sistema y pasa su URI a la función. El trabajo de decodificación debe realizarse fuera del hilo principal.
import android.content.Context
import android.graphics.Bitmap
import android.media.MediaMetadataRetriever
import android.net.Uri
fun frameAt(context: Context, video: Uri, millis: Long): Bitmap? {
require(millis >= 0)
val retriever = MediaMetadataRetriever()
return try {
retriever.setDataSource(context, video)
retriever.getFrameAtTime(
millis * 1000L, // la API recibe microsegundos
MediaMetadataRetriever.OPTION_CLOSEST
)
} finally {
retriever.release()
}
}
Qué demuestra el código
La opción OPTION_CLOSEST intenta seleccionar un fotograma cercano al instante indicado. Otra opción, OPTION_CLOSEST_SYNC, se limita a fotogramas de sincronización cercanos y puede ser más rápida, pero no siempre produce la imagen deseada.
Pruebas recomendadas
Prueba con un clip corto y extrae imágenes en 0, 500 y 2500 milisegundos. Compara el resultado visual con la línea de tiempo de un reproductor. Repite con un vídeo de otro códec para observar diferencias de comportamiento.
Límites que conviene reconocer
Este código no exporta la imagen ni procesa lotes; tampoco promete exactitud fotograma a fotograma. Algunos formatos fallan al decodificar y un bitmap completo puede consumir mucha memoria. Para lotes largos hay que gestionar recursos y cancelación.
Qué aprendemos
Milisegundos no equivalen a índices de frame. Una interfaz de selección precisa debe explicar qué devuelve su ruta de decodificación.
Contexto y enlaces del autor
El tema se relaciona con las funciones declaradas públicamente de Video to Photo: Extraer Fotos, una aplicación Android de AppInitDev. El código anterior es un ejemplo independiente: no se ha inspeccionado el repositorio privado ni se afirma que sea la implementación interna de la app. La referencia aparece al final para ofrecer contexto, no como requisito para completar el tutorial.
- Google Play: Video to Photo: Extraer Fotos
- Página de la aplicación: https://capture-premium.appinitdev.com/
- Sitio del desarrollador: AppInitDev

Top comments (0)