Ho estratto i fotogrammi da un video utilizzando MetadataRetriever e ho memorizzato tutte le immagini in un ArrayList<Bitmap>
. Voglio memorizzarli tutti su una scheda SD (solo a scopo di test).MediaMetadataRetriever.getFrameAtTime() restituisce solo il primo fotogramma
Ma quando estraggo una cartella dall'emulatore e guardo le immagini salvate, tutte le immagini erano solo del primo fotogramma del video.
Questo è quanto ho estrarre i fotogrammi del video:
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);
}
E questo è come io li sto salvando (sto chiamando questo metodo e passando l'ArrayList bitmap):
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();
}
Quando estraggo una cartella per vedere tutti i fotogrammi, tutte le immagini erano del primo fotogramma del video. Qualcuno può spiegarmi cosa sta succedendo?
UPDATE:
ho provato con un altro video. Ho scoperto che non sto ottenendo immagini vuote, ma restituisce sempre solo il primo fotogramma.
MediaMetadataRetriever.getFrameAtTime(long timeUS)
restituisce solo il primo frame, ma voglio recuperare tutti i frame. Quali cambiamenti dovrei apportare?
Come si affronta questo?
Avevo provato il codice qui sopra per ottenere i fotogrammi da video, ma per me ripete il primo fotogramma per tutto il resto di cornici. – Manoj
Avevo provato il codice precedente per ottenere i fotogrammi dal video ma per me ripete il primo fotogramma per tutti gli altri fotogrammi. La durata del mio file era 127040 (2: 07sec) qui ho diviso il mio video per 32 fotogrammi in grado di visualizzare tutti i 32 le immagini ma come le stesse immagini avevo provato molto da sistemare ma non uso non so dove va male puoi aiutarmi con il tuo codice completo di successo per ottenere immagini diverse senza l'aiuto di ffmpeg – Manoj
dovrei includere qualcosa in AndroidManifest – Manoj