2012-04-17 15 views
11

Il MediaMetadataRetriever.getFrameAtTime() restituisce sempre gli stessi frame quando si chiama. avere uno sguardo il mio codiceCome ottenere il frame dal file video in 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; 

    } 
} 

Questo metodo restituisce sempre stessi telai

+1

Questo è il comportamento che ci si può aspettare, come da documentazione: * "Questo metodo trova un frame rappresentativo vicino alla data posizione data considerando l'opzione data ** se possibile **, e la restituisce come una bitmap. contenente un frame video rappresentativo, che può essere nullo, se tale frame non può essere recuperato. "* –

+0

@MH. grazie per la risposta, come posso ottenere i frame dal file video. Dai un'occhiata alla mia [domanda] (http://stackoverflow.com/questions/10071408/how-to-get-frames-of-video-file-in-android) –

+2

Dopo 3 anni, sto ancora cercando di trovarlo difficile per la soluzione ... qualcuno sa della soluzione ??? –

risposta

9

Non so quanto tempo è il tuo video, ma il tempo da utilizzare nel lungo var come il tempo per getTimeAtFrame deve essere espresso in MICRO secondi

es: un video di 1 secondo hanno 1000000 USeconds, se usi un periodo molto breve (come te), devi essere molto fortunato a recuperare il primo fotogramma che hai solo del video !!!

+0

Quali dovrebbero essere i valori del ciclo for .. Si prega di mostrare il codice e spiegarlo .. – Nepster

+1

Ho avuto questo problema troppo e sono sicuro che non ha nulla a che fare con l'intervallo di tempo che viene utilizzato. E l'esempio dell'OP sta usando micro secondi. –

0

Léon Pelletier ha ragione. Il problema è che MediaMetadataRetriever.getFrameAtTime() è in grado di estrarre solo fotogrammi chiave dal video al secondo livello . Ad esempio, se un video ha circa 4 secondi, puoi ottenere solo 4 o 5 fotogrammi diversi. Per ottenere tutti i frame video, fare riferimento a MediaCodec.

+0

Penso che questo non dovrebbe postare come risposta. Dovresti postarlo come commento. – Jaimesh

+0

La mia risposta originale ha risposto alla domanda sullo stesso frame e l'ho modificata in modo che risponda anche al titolo. – DeTac

Problemi correlati