如何在安卓设备上获取视频缩略图

6

我希望能够得到帮助,创建从我的安卓手机录制的视频的缩略图。我从这个链接中获取了代码,并修改了其中的一部分以生成缩略图,但是不知何故缩略图没有被生成。如有任何帮助,将不胜感激。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK && requestCode == VIDEO_CAPTURED) {
        videoFileUri = data.getData();
        if (videoFileUri != null) {
           Bitmap image= ThumbnailUtils.createVideoThumbnail(videoFileUri.toString(),MODE_APPEND);

 ImageView imageView=(ImageView)findViewById(R.id.image);
 imageView.setImageBitmap(image);
        }

        playVideoButton.setEnabled(true);
    }
}

看起来你正在创建缩略图位图(我猜测),然后什么也没做。这真的是所有相关的代码吗? - SpaceBison
我必须将位图设置在ImageView中,现在我已经编辑了我的答案,请看一下。 - Vipul Singh
@VipulSingh 请尝试使用Picasso或Glide加载位图,我已经检查过它们始终有效。链接 斜体 粗体 - Jaydip Radadiya
4个回答

21

您可以使用glide,它会自动设置视频的缩略图。

Glide还能显示视频的缩略图,只要它们存储在手机上。假设您通过让用户选择一个视频来获取文件路径:根据这篇文章 https://futurestud.io/tutorials/glide-displaying-gifs-and-videos

String filePath = "/storage/emulated/0/Pictures/example_video.mp4";

Glide  
    .with(context)
    .asBitmap()
    .load(Uri.fromFile(new File(filePath)))
    .into(imageViewGifAsBitmap);

它运行得非常完美,我只需对我的代码进行一些修改以生成捕获视频的路径,然后所有事情都完成了,谢谢。 - Vipul Singh
很高兴能帮助你 :) 感谢您接受了这个答案。 - Mayur Patel
@VipulSingh,你能顺便给我的回答点个赞吗?如果可以的话。 - Mayur Patel
但是我正在使用Fresco,它没有自动设置缩略图,那我该怎么办呢?我已经为你的答案点赞了。 - John dahat
完美答案,解决在RecyclerView中ExoPlayer的OOM崩溃问题。 - Abhay Koradiya
显示剩余2条评论

0

这是完整的经过测试的工作解决方案:

试一下吧。

    if (videoFileUri != null) {

                        Bitmap bitmapThumb = null;
                        try {
                            bitmapThumb = ThumbnailUtils.createVideoThumbnail(videoFileUri.toString(),
                                    MediaStore.Video.Thumbnails.MINI_KIND);// MINI_KIND, size: 512 x 384 thumbnail | MICRO_KIND, size: 96 x 96 thumbnail

                            ImageView imageView = (ImageView) findViewById(R.id.image);
//                            imageView.setImageBitmap(bitmapThumb);

                            Uri uri = getImageUri(context, bitmapThumb);

                            Picasso.with(context)
                                    .load(uri)
                                    .placeholder(R.drawable.ic_imagedefault)
                                    .error(R.drawable.ic_imagedefault)
                                    .resize(350, 200)//as per need.
                                    .centerCrop()
                                    .into(imageView);

                        } catch (Exception e) {
                            e.printStackTrace();
                        } finally {
                            bitmapThumb = null;
                        }
                    }
                }

这里是静态方法 getImageUri 的代码:

public static Uri getImageUri(Context inContext, Bitmap inImage) {

    try {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        inImage.compress(Bitmap.CompressFormat.PNG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
        return Uri.parse(path);
    } catch (Exception e) {
        e.printStackTrace();
        return Uri.parse("");
    }

}

我已经做了所有的事情,但似乎在这里不起作用...我不知道为什么。 - Vipul Singh
@VipulSingh 最终你使用了什么? - Astha Garg

0

这种方式已经过时了。 - stolen_leaves

-4
Uri uri = getImageUri(context, bitmapThumb);
Glide.with(getContext()).
load(uri).
thumbnail(0.1f).
into(imageView);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接