从视频文件创建缩略图返回null位图
我送的意图,启动摄像机从视频文件创建缩略图返回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
文件支持,所以我在这里做错了什么?
使用此文件“媒体文件”,并将其转换成URI
Uri uri=Uri.fromFile(mediaFile);
然后传递URI在下面的方法。这在我身边很好。
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(uri.getPath(), MediaStore.Video.Thumbnails.MICRO_KIND);
希望这会帮助你。
对不起,没有工作 – tyczj 2013-12-29 01:01:16
我记得,论证filePath
从createVideoThumbnail应该是一个经典的文件路径,而不是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);'但我想指定路径,以便我的用户可以轻松找到视频 – tyczj 2013-12-30 16:32:48
您可以尝试MediaMetadataRetriever或FFmpegMediaMetadataRetriever。这里有一个例子:
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(intent.getDataString());
Bitmap b = mmr.getFrameAtTime();
mmr.release();
嗨,我希望你解决了这个问题。请分享如何。我也面临同样的问题 – 2014-04-02 09:14:35