我已经使用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)
仅返回第一帧,但我想检索所有帧。我应该做些什么改变?我该如何解决?
最佳答案
MediaMetadataRetriever
的getFrameAt
方法以毫秒(1/1000000秒)为单位,而不是毫秒,因此,在您的情况下,它总是四舍五入到第一帧。