He extraído fotogramas de un video usando MetadataRetriever y he almacenado todas las imágenes en ArrayList<Bitmap>
. Quiero almacenarlos todos en una tarjeta SD (solo para fines de prueba).MediaMetadataRetriever.getFrameAtTime() devuelve solo el primer fotograma
Pero cuando saco una carpeta del emulador y miro las imágenes guardadas, todas las imágenes eran solo del primer fotograma del video.
Éste es cómo extraer los cuadros del vídeo:
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);
}
y así es como yo los estoy ahorrando (Voy a llamar a este método y pasar el ArrayList de mapa de bits):
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();
}
Cuando saco una carpeta para ver todos los marcos, todas las imágenes eran del primer cuadro de video. ¿Puede alguien por favor explicarme qué está pasando?
ACTUALIZACIÓN:
he intentado con otro video. Descubrí que no obtengo imágenes en blanco, pero siempre devuelve el primer cuadro solamente.
MediaMetadataRetriever.getFrameAtTime(long timeUS)
devuelve solo el primer fotograma, pero quiero recuperar todos los fotogramas. ¿Qué cambios debo hacer?
¿Cómo me ocupo de esto?
Había probado el código anterior para conseguir los fotogramas de vídeo, pero para mí se repite el primer marco para el resto de cuadros. – Manoj
He intentado su código anterior para obtener los cuadros de video pero para mí repite el primer cuadro para el resto de cuadros. Mi duración de archivo fue 127040 (2: 07sec) aquí dividí mi video para 32 fotogramas, puedo ver todos los 32 imágenes, pero como las mismas imágenes que he intentado corregir, pero no sirve, no sé dónde va mal, ¿me pueden ayudar con su código de éxito completo para obtener diferentes imágenes sin la ayuda de ffmpeg – Manoj
si incluyo algo en AndroidManifest – Manoj