【问题标题】:Creating thumbnail from video file returns null bitmap从视频文件创建缩略图返回空位图
【发布时间】:2013-04-11 14:43:41
【问题描述】:

我发送了启动摄像机的意图

PackageManager pm = getPackageManager();
    if(pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            Intent video = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
            File tempDir= new File(Environment.getExternalStoragePublicDirectory(
                      Environment.DIRECTORY_PICTURES), "BCA");
            if(!tempDir.exists())
            {
                if(!tempDir.mkdir()){
                    Toast.makeText(this, "Please check SD card! Image shot is impossible!", Toast.LENGTH_SHORT).show();
                }
            }

                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",Locale.US).format(new Date());
                File mediaFile = new File(tempDir.getPath() + File.separator +
                "VIDEO_"+ timeStamp + ".mp4");
                Uri videoUri = Uri.fromFile(mediaFile);
                video.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
                video.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
                startActivityForResult(video, VIDEO_REQUEST);

    }else{
        Toast.makeText(this, "This device does not have a rear facing camera",Toast.LENGTH_SHORT).show();
    }

我拍摄了一个视频,它被正确存储,当onActivityResult 被解雇时,我使用意图获取其存储的uri 以创建位图

这是 uri file:///storage/emulated/0/Pictures/BCA/VIDEO_20131227_145043.mp4 的示例

 Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(intent.getDataString(), MediaStore.Video.Thumbnails.MICRO_KIND);

但位图每次都是空的。因此,由于文档说May return null if the video is corrupt or the format is not supported,我检查了目录中的视频,它播放正常,加上它支持的.mp4 文件,那么我在这里做错了什么?

【问题讨论】:

  • 嗨,我希望你解决了这个问题。请分享如何。我也面临同样的问题

标签: android android-camera video-thumbnails


【解决方案1】:

您可以尝试MediaMetadataRetrieverFFmpegMediaMetadataRetriever。这是一个例子:

FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(intent.getDataString());
Bitmap b = mmr.getFrameAtTime();
mmr.release();

【讨论】:

    【解决方案2】:

    我记得,createVideoThumbnail 中的参数 filePath 应该是经典文件路径,而不是 URI

    ...
    
    Uri videoUri = intent.getData();
    final String realFilePath = getRealPathFromUri();
    Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(realFilePath, MediaStore.Video.Thumbnails.MICRO_KIND);
    ...
    
    public String getRealPathFromURI(final Uri contentURI) {
        Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
        if (cursor == null) { // Source is Dropbox or other similar local file path
            return contentURI.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.MediaColumns.DATA);
            if ( idx == -1 ) {
                return contentURI.getPath();
            }
            String rvalue =  cursor.getString(idx);
            cursor.close();
            return rvalue;
        }
    }
    

    编辑:

    基于createVideoThumbnail的源码,我又创建了一个实现:

    public static Bitmap createVideoThumbnail(Context context, Uri uri, int kind) {
        Bitmap bitmap = null;
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
            retriever.setDataSource(context, uri);
            bitmap = retriever.captureFrame();
        } catch (IllegalArgumentException ex) {
            // Assume this is a corrupt video file
        } catch (RuntimeException ex) {
            // Assume this is a corrupt video file.
        } finally {
            try {
                retriever.release();
            } catch (RuntimeException ex) {
                // Ignore failures while cleaning up.
            }
        }
        if (kind == Images.Thumbnails.MICRO_KIND && bitmap != null) {
            bitmap = ThumbnailUtils.extractThumbnail(bitmap,
                    ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL,
                    ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL,
                    ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
        }
        return bitmap;
    }
    

    【讨论】:

    • 我发现如果我不给它一个路径到我想保存视频的位置,我会返回一个ContentProvider Uri,然后我可以使用这种方法获取缩略图MediaStore.Video.Thumbnails.getThumbnail(getContentResolver(), id, MediaStore.Video.Thumbnails.MICRO_KIND, options);,但我想要指定路径,以便我的用户可以轻松找到视频
    【解决方案3】:

    使用此文件“mediaFile”并将其转换为 URI

          Uri uri=Uri.fromFile(mediaFile);
    

    然后在下面的方法中传递该 URI。这在我身边工作得很好。

    Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(uri.getPath(), MediaStore.Video.Thumbnails.MICRO_KIND);
    

    希望这会对你有所帮助。

    【讨论】:

      【解决方案4】:

      我遇到了这个问题并以这种方式解决了它:

      1. 创建FileUtils 为您找到文件路径的类(我找不到该类的引用,所以我创建了一个要点)

        String correctedUri = FileUtils.getPath(mContext, Uri.parse(localUri));
        
      2. 使用以下代码

        Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(correctedUri, MediaStore.Video.Thumbnails.MICRO_KIND);
        

      已编辑: 请参阅this 解决方案它具有更好的性能和更容易。

      【讨论】:

        猜你喜欢
        • 2010-12-18
        • 2018-05-15
        • 1970-01-01
        • 2012-02-24
        • 2019-06-26
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多