MediaMetadataRetriever.getFrameAtTime () возвращает только первый кадр
Я извлек кадры из видео с помощью MetadataRetriever и сохранил все изображения вArrayList<Bitmap>
, Я хочу хранить их все на SD-карте (только для целей тестирования).
Но когда я извлекаю папку из эмулятора и смотрю на сохраненные изображения, все изображения были только из первого кадра видео.
Вот как я извлекаю кадры из видео:
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);
}
И вот как я их сохраняю (я вызываю этот метод и передаю битовый массив 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();
}
Когда я вытаскиваю папку, чтобы увидеть все кадры, все изображения были первого кадра видео. Может кто-нибудь объяснить мне, что происходит?
UPDATE:
Я пробовал с другим видео. Я обнаружил, что не получаю пустых изображений, но он всегда возвращает только первый кадр.
MediaMetadataRetriever.getFrameAtTime(long timeUS)
возвращает только первый кадр, но я хочу получить все кадры. Какие изменения я должен сделать?
Как мне справиться с этим?