我已经使用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)仅返回第一帧,但我想检索所有帧。我应该做些什么改变?

我该如何解决?

最佳答案

MediaMetadataRetrievergetFrameAt方法以毫秒(1/1000000秒)为单位,而不是毫秒,因此,在您的情况下,它总是四舍五入到第一帧。

10-08 05:33