Android在特定时间创建视频缩略图

时间:2014-03-11 17:04:48

标签: android video time

我已经准备好从我的视频创建缩略图了。 代码如下所示:

videoGalleryThumbnails.add(ThumbnailUtils.extractThumbnail(ThumbnailUtils.createVideoThumbnail(
                    videoFile.getAbsolutePath(), MediaStore.Images.Thumbnails.MINI_KIND), 500, 200));

但创建的缩略图是非常糟糕的时间。这恰好是视频是黑色的。现在我没有使用完全黑色的缩略图。

如何在特定时间拍摄视频缩略图?例如。在00:31或01:44?

或者不可能?

我还尝试使用MediaMetadataRetriever,但我只得到一张白色图片。代码看起来像这样

File tempVideoList[] = (Environment.getExternalStoragePublicDirectory(PATH_VIDEO_GALLERY))
            .listFiles();
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
Bitmap myBitmap=null;
for (File videoFile : tempVideoList) {
    if (videoFile.isFile()) {
        //from here
        try {
            retriever.setDataSource(videoFile.getAbsolutePath());
            myBitmap = retriever.getFrameAtTime(11); //at 11th second
        } catch (Exception ex) {
            Log.i("MyDebugCode", "MediaMetadataRetriever got exception:" + ex);
        }

    videoGalleryThumbnails.add(myBitmap);
    //to here
}

如果我使用顶部的第一个代码将标记为“from here”的代码替换为“to here”,则可以正常工作。 我还尝试了MediaMetadataRetriever.OPTION_CLOSEST和OPTION_CLOSEST_SYNC以及OPTION_NEXT_SYNC。

2 个答案:

答案 0 :(得分:5)

好的,我明白了。 MediaMetadataRetriever绝对是正确的选择。问题是,它以微秒为单位计算时间,而不是以秒为单位。解决方案如下所示:

try {
        retriever.setDataSource(videoFile.getAbsolutePath());
        int timeInSeconds = 30;
        myBitmap = retriever.getFrameAtTime(timeInSeconds * 1000000,
                    MediaMetadataRetriever.OPTION_CLOSEST_SYNC); 
    } catch (Exception ex) {
        Log.i("MyDebugCode", "MediaMetadataRetriever got exception:" + ex);
    }

videoGalleryThumbnails.add(myBitmap);

我不知道,如果确实需要OPTION_CLOSEST_SYNC,但看起来这是更好的编程方式。

感谢William Riley指出我正确的方向。

答案 1 :(得分:0)

此代码几乎不需要更改:

try {

    MediaMetadataRetriever retriever = new MediaMetadataRetriever();

//必须控制setDataSource的版本

   if (Build.VERSION.SDK_INT >= 14)
       retriever.setDataSource(video_path, new HashMap<String, String>());
   else
       retriever.setDataSource(video_path);
   int timeInSeconds = 5;
   Bitmap thumb = retriever.getFrameAtTime(timeInSeconds * 1000000,
                                MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
   imageViewThumb.setImageBitmap(thumb);
   } catch (Exception ex) {
        ex.printStackTrace();
   }

如果我们不控制&#34; setDataSource &#34;的版本然后我们会得到例外。对我来说,直到版本控制它才能正常工作。