我已經使用MetadataRetriever從視頻中提取了幀,並將所有圖像存儲在ArrayList<Bitmap>
中。我想將它們全部存儲在SD卡上(僅用於測試目的)。MediaMetadataRetriever.getFrameAtTime()僅返回第一幀
但是,當我從模擬器中拉出一個文件夾並查看保存的圖像時,所有圖像僅爲視頻的第一幀。
這是我從視頻中提取幀:
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)
只返回第一幀,但我想檢索所有幀。我應該做什麼改變?
我該如何解決這個問題?
我試過你上面的代碼包含用於獲取視頻幀,但對我來說,重複所有,其餘的第一幀的幀。 – Manoj
我已經試過你的上述代碼從視頻獲取幀,但對我來說,它重複frames.frame文件的所有其餘的第一幀。我的文件持續時間是127040(2:07秒)在這裏我分裂我的視頻爲32幀可以查看所有32圖像,但作爲相同的圖像我想了很多修復,但沒有用我不知道它出了什麼地方,你可以幫我通過你的成功完整的代碼獲得不同的圖像沒有ffmpeg – Manoj
幫助我應該包括任何東西在AndroidManifest – Manoj