MediaMetadataRetriever getFrameAtTime возвращает только первый кадр

Приведенный ниже код возвращает (test.gif) только первый кадр и создает рисунок с 5 одинаковыми кадрами (первый кадр видео).

Я читаю большинство вопросов в Stackru, но не могу понять, что является причиной этой проблемы.

Также, по некоторым предложениям, я пытался использовать mmRetriever.getFrameAtTime с MediaMetadataRetriever.OPTION_CLOSEST вариант без успеха.

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {

            Uri vid = data.getData();
            videoPath = getPath(vid);

            MediaMetadataRetriever mmRetriever = new MediaMetadataRetriever();
            mmRetriever.setDataSource(videoPath);
            String METADATA_KEY_DURATION = mmRetriever  
                    .extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);  


            ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

            AnimatedGifEncoder encoder = new AnimatedGifEncoder();
            encoder.setDelay(30);
            encoder.start(bos);

            int max = (int) Long.parseLong(METADATA_KEY_DURATION);
            Log.i("max",String.valueOf(max));
            for (int i=1000000;i<max*1000;i+=1000000) {
                Log.i("i",String.valueOf(i));   

                Bitmap bitmap = mmRetriever.getFrameAtTime(i,MediaMetadataRetriever.OPTION_CLOSEST);

                encoder.addFrame(bitmap);


            }
            encoder.finish();
            try {
                String filepath = Environment.getExternalStorageDirectory()
                        + File.separator + "test.gif";
                FileOutputStream outStream = new FileOutputStream(filepath);
                outStream.write(bos.toByteArray());
                outStream.close();
                GifAnimationDrawable big = new GifAnimationDrawable(
                        new FileInputStream(filepath));

                imageview.setImageDrawable(big);
                big.setVisible(true, true);

            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }

Максимальное значение возврата журнала около 5000

1 ответ

Из этого источника:

Метод getFrameAt в MediaMetadataRetriever занимает микросекунды (1/1000000 секунды) вместо миллисекунд, поэтому в вашем случае он всегда округляется до 1-го кадра.

Другие вопросы по тегам