我已经准备好从我的视频创建缩略图了。 代码如下所示:
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。
答案 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;的版本然后我们会得到例外。对我来说,直到版本控制它才能正常工作。