2013-04-11 71 views
7

我送的意图,启动摄像机从视频文件创建缩略图返回null位图

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); 

的一个例子,但该位图是每次都是null。所以,由于文档说May return null if the video is corrupt or the format is not supported我检查目录中的视频,它播放罚款加上其.mp4文件支持,所以我在这里做错了什么?

+0

嗨,我希望你解决了这个问题。请分享如何。我也面临同样的问题 – 2014-04-02 09:14:35

回答

1

使用此文件“媒体文件”,并将其转换成URI

 Uri uri=Uri.fromFile(mediaFile); 

然后传递URI在下面的方法。这在我身边很好。

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

希望这会帮助你。

+0

对不起,没有工作 – tyczj 2013-12-29 01:01:16

2

我记得,论证filePathcreateVideoThumbnail应该是一个经典的文件路径,而不是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; 
} 
+0

我发现,如果我不给它一个路径,我想保存视频,我得到一个'ContentProvider Uri',然后我可以使用此方法获取缩略图'MediaStore.Video.Thumbnails.getThumbnail(getContentResolver(),id,MediaStore.Video.Thumbnails.MICRO_KIND,options);'但我想指定路径,以便我的用户可以轻松找到视频 – tyczj 2013-12-30 16:32:48

3

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

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

我面对这个问题,解决这样说:

  1. 创建FileUtils类找不到文件的路径为你(我无法找到类的引用,以便我创建了一个要点)

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

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

编辑:this解决方案具有更好的性能和更容易。