【问题标题】:MediaMetadataRetriever getFrameAtTime return first frame onlyMediaMetadataRetriever getFrameAtTime 仅返回第一帧
【发布时间】:2014-10-14 18:23:49
【问题描述】:

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

我阅读了 StackOverflow 中的大多数问题,但我无法弄清楚导致此问题的原因。

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

【问题讨论】:

标签: android video animated-gif mediametadataretriever


【解决方案1】:

来自this 来源:

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

【讨论】:

  • i 更新代码为:for (int i=1000000;i
  • William,这是什么意思,我使用 log 并且 i 等于 1000000,2000000,... 在每一步中,是不是正确的?
  • 第一帧返回问题,和最初给出的一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2015-06-11
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多