2013-04-11 75 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解決方案具有更好的性能和更容易。