Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MediaMetadataRetriever getFrameAtTime仅返回第一帧_Android_Video_Animated Gif_Mediametadataretriever - Fatal编程技术网

Android MediaMetadataRetriever getFrameAtTime仅返回第一帧

Android MediaMetadataRetriever getFrameAtTime仅返回第一帧,android,video,animated-gif,mediametadataretriever,Android,Video,Animated Gif,Mediametadataretriever,下面的代码仅返回(test.gif)第一帧,并使用5个相同帧(视频第一帧)生成gif 我阅读了StackOverflow中的大多数问题,但我不知道是什么导致了这个问题 另外,根据一些建议,我尝试将mmRetriever.getFrameAtTime与mediamataretriever.OPTION\u最近的选项一起使用,但没有成功 @Override public void onActivityResult(int requestCode, int resultCode, Intent

下面的代码仅返回(test.gif)第一帧,并使用5个相同帧(视频第一帧)生成gif

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

另外,根据一些建议,我尝试将
mmRetriever.getFrameAtTime
mediamataretriever.OPTION\u最近的
选项一起使用,但没有成功

@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();
            }

        }

    }
@覆盖
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(resultCode==RESULT\u OK){
Uri vid=data.getData();
videoPath=getPath(vid);
MediaMetadataRetriever mmRetriever=新的MediaMetadataRetriever();
mmRetriever.setDataSource(videoPath);
字符串元数据\u键\u持续时间=mmRetriever
.extractMetadata(MediaMetadataRetriever.METADATA\u KEY\u DURATION);
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
AnimatedGifEncoder编码器=新的AnimatedGifEncoder();
编码器。设置延迟(30);
编码器启动(bos);
int max=(int)Long.parseLong(元数据\u键\u持续时间);
Log.i(“max”,String.valueOf(max));
对于(int i=1000000;i来源:


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

i使用:for更新代码(int i=1000000;iWilliam,这是什么意思,我使用log,i等于1000000000000,…在每一步中,它是否正确?第一帧返回问题,与最初给出的问题相同。我不明白为什么这个问题给出否定?问题在哪里?我有问题,并尽可能给出详细信息,必须看到