2012-04-17 16 views
11

El MediaMetadataRetriever.getFrameAtTime() siempre devuelve mismos marcos cuando vuelvas a llamar. echar un vistazo a mi códigoCómo conseguir el marco del archivo de vídeo en Android

private ArrayList<Bitmap> getFrames(String path){ 
    try { 
     ArrayList<Bitmap> bArray = new ArrayList<Bitmap>(); 
     bArray.clear(); 
     MediaMetadataRetriever mRetriever = new MediaMetadataRetriever(); 
     mRetriever.setDataSource(getDataSource(path)); 

     for (int i = 3000; i <60000; i=i+5000) { 
      bArray.add(mRetriever.getFrameAtTime(i, MediaMetadataRetriever.OPTION_CLOSEST_SYNC)); 

     } 

     return bArray; 
    } catch (Exception e) { 
     // TODO: handle exception 

     return null; 

    } 
} 

Este método devuelve siempre mismos marcos

+1

Eso es un comportamiento que se puede esperar, según documentación: * "Este método encuentra un fotograma representativo cerca de la posición de tiempo determinado considerando la opción dada ** ** si es posible, y lo devuelve como un mapa de bits de devoluciones:. Un mapa de bits que contiene un fotograma de video representativo, que puede ser nulo, si dicho fotograma no se puede recuperar. "* –

+0

@MH. Gracias por responder, ¿cómo puedo obtener los marcos del archivo de video. Echar un vistazo a mi [pregunta] (http://stackoverflow.com/questions/10071408/how-to-get-frames-of-video-file-in-android) –

+2

Después de 3 años, todavía estoy tratando de encontrar dificultades para la solución ... ¿alguien sabe sobre la solución? –

Respuesta

9

No sé cuánto tiempo es el vídeo, pero el tiempo para usar en el largo var como el tiempo para getTimeAtFrame debe expresarse en MICRO segundos

por ejemplo: un video de 1 segundo tiene 1000000 ¡Un segundo, si usa un período muy corto (como usted), debe tener mucha suerte para recuperar el primer fotograma que tiene su video!

+0

¿Cuáles deberían ser los valores del bucle for ... Mostrar el código y explicarlo ... – Nepster

+1

He tenido este problema también y definitivamente estoy seguro de que no tiene nada que ver con el intervalo de tiempo que se utiliza. Y el ejemplo de OP usa micro segundos. –

0

Léon Pelletier es correcto. El problema es que MediaMetadataRetriever.getFrameAtTime() sólo podía extraer fotogramas clave de vídeo en segundo nivel. Por ejemplo, si un video tiene aproximadamente 4 segundos, puede obtener solo 4 o 5 marcos diferentes. Para obtener todos los marcos de video, consulte MediaCodec.

+0

Creo que esto no debería publicar como respuesta. Deberías publicarlo como comentario. – Jaimesh

+0

Mi respuesta original respondió la pregunta del mismo cuadro, y la modifiqué para que también responda el título. – DeTac

Cuestiones relacionadas