我使用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();
}
当我拿出一个文件夹查看所有帧时,所有的图像都是第一帧视频的图像。有人能给我解释一下发生了什么事吗?
更新:
我试过用另一个视频。我发现我没有得到空白图像,但它总是只返回第一帧。
MediaMetadataRetriever.getFrameAtTime(long timeUS)
只返回第一帧,但我想检索所有帧。我应该做哪些更改?
我该如何解决这个问题呢?
https://stackoverflow.com/questions/12772547
复制相似问题