MediaMetadataRetriever.getFrameAtTime() returns only first frame

前端 未结 7 1577
不思量自难忘°
不思量自难忘° 2020-12-01 12:12

I have extracted frames from a video using MetadataRetriever, and have stored all images in an ArrayList. I want to store all of them on an SD car

7条回答
  •  不知归路
    2020-12-01 12:34

    long time;
    
        String formattedFileCount;
        FileOutputStream fos;
        BufferedOutputStream bos;
    
        NumberFormat fileCountFormatter = new DecimalFormat("00000");
        int fileCount = 0;
        File jpegFile;
        ArrayList bArray = null;
        Bitmap lastbitmap = null; 
        bArray = new ArrayList();
    

    I am taking Time in microseconds and em getting duration from the Mediaplayer like:

    time = mp.getDuration()*1000;
    Log.e("Timeeeeeeee", time);
    
    
                    bArray.clear();
                    MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
                    mRetriever.setDataSource(path);
                    int  j=0;
    

    My frame rate is 12 frame/sec so I divided 1/12 = 0.083333 and this is the second's part of a frame and than I convert my frame sec to microsecond so it becomes 83333

                    for (int i = 833333; i <= time; i=i+83333) {
                        bArray.add(mRetriever.getFrameAtTime(i, MediaMetadataRetriever.OPTION_CLOSEST_SYNC));
    
    
    
                        formattedFileCount = fileCountFormatter.format(fileCount); 
                        lastbitmap = bArray.get(j);
                        j++;
                         // image is the bitmap
                            jpegFile = new File(Environment.getExternalStorageDirectory().getPath() + "/frames/frame_" + formattedFileCount + ".jpg");
                            fileCount++;
    
                            try {
                                fos = new FileOutputStream(jpegFile);
                                bos = new BufferedOutputStream(fos);
                                lastbitmap.compress(Bitmap.CompressFormat.JPEG, 15, bos);
    
                                bos.flush();
                                bos.close();
                            } catch (FileNotFoundException e) {
    
                                e.printStackTrace();
                            } catch (IOException e) {
    
                                e.printStackTrace();
                            }
    
                    }
    
                } catch (Exception e) {
    
    
                }
    

提交回复
热议问题