2

下面的代码只返回(test.gif)第一帧,并用 5 个相同的帧(视频第一帧)制作一个 gif。

我在 StackOverflow 中阅读了大多数问题,但我不知道是什么导致了这个问题。

另外,根据一些建议,我尝试使用mmRetriever.getFrameAtTimewithMediaMetadataRetriever.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

4

1 回答 1

1

这个来源:

MediaMetadataRetriever的 getFrameAt 方法需要微秒(1/1000000 秒)而不是毫秒,因此在您的情况下,它总是向下舍入到第一帧。

于 2014-10-15T16:52:37.610 回答