MediaMetadataRetriever.getFrameAtTime () zwraca tylko pierwszą klatkę

Wyodrębniłem ramki z filmu za pomocą MetadataRetriever i zapisałem wszystkie obrazy w formacieArrayList<Bitmap>. Chcę przechowywać je wszystkie na karcie SD (tylko w celach testowych).

Ale kiedy wyciągam folder z emulatora i patrzę na zapisane obrazy, wszystkie obrazy były tylko pierwszej klatki wideo.

W ten sposób wyodrębniam klatki z filmu:

File videoFile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/videos","sample_mpeg4.mp4");

Uri videoFileUri=Uri.parse(videoFile.toString());

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(videoFile.getAbsolutePath());
ArrayList<Bitmap> rev=new ArrayList<Bitmap>();

//Create a new Media Player
MediaPlayer mp = MediaPlayer.create(getBaseContext(), videoFileUri);

int millis = mp.getDuration();
for(int i=0;i<millis;i+=100){
   Bitmap bitmap=retriever.getFrameAtTime(i,OPTION_CLOSEST_SYNC);
   rev.add(bitmap);
}

I tak je zapisuję (wywołuję tę metodę i przekazuję bitmapę ArrayList):

public void saveFrames(ArrayList<Bitmap> saveBitmapList) throws IOException{
    Random r = new Random();
    int folder_id = r.nextInt(1000) + 1;

    String folder = Environment.getExternalStorageDirectory()+"/videos/frames/"+folder_id+"/";
    File saveFolder=new File(folder);
    if(!saveFolder.exists()){
       saveFolder.mkdirs();
    }

    int i=1;
    for (Bitmap b : saveBitmapList){
       ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        b.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

        File f = new File(saveFolder,("frame"+i+".jpg"));

        f.createNewFile();

        FileOutputStream fo = new FileOutputStream(f);
        fo.write(bytes.toByteArray());

           fo.flush();
           fo.close();

        i++;
    }
    Toast.makeText(getApplicationContext(),"Folder id : "+folder_id, Toast.LENGTH_LONG).show();

}

Gdy wyciągam folder, aby zobaczyć wszystkie ramki, wszystkie obrazy były pierwszej klatki wideo. Czy ktoś może mi wyjaśnić, co się dzieje?

AKTUALIZACJA:

Próbowałem z innym filmem. Odkryłem, że nie otrzymuję pustych obrazów, ale zawsze zwraca tylko pierwszą klatkę.

MediaMetadataRetriever.getFrameAtTime(long timeUS) zwraca tylko pierwszą klatkę, ale chcę pobrać wszystkie ramki. Jakie zmiany powinienem wprowadzić?

Jak sobie z tym poradzić?

questionAnswers(5)

yourAnswerToTheQuestion