DEV Community

 AppInitDev
AppInitDev

Posted on

Extraer un fotograma de vídeo en Android: tiempo solicitado frente a frame real

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()
    }
}
Enter fullscreen mode Exit fullscreen mode

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.

Image APPS

Referencia técnica

Android: MediaMetadataRetriever

Top comments (0)