在項(xiàng)目中,有時(shí)候需要抓取視頻文件的某一幀圖像做為預(yù)覽圖片,那到底應(yīng)該怎么獲取這個(gè)圖片呢?
Android為我們提供了一個(gè)統(tǒng)一的接口用來(lái)獲取多媒體文件的相關(guān)信息:MediaMetadataRetriever;
創(chuàng)建MediaMetadataRetriever對(duì)象`
MediaMetadataRetriever mmr=new MediaMetadataRetriever();
設(shè)置資源位置
String path="/storage/sdcard1"+"/Movies"+"/XiaomiPhone.mp4";
綁定資源
mmr.setDataSource(path);
//獲取第一幀圖像的bitmap對(duì)象
Bitmap bitmap=mmr.getFrameAtTime();
//加載到ImageView控件上
img.setImageBitmap(bitmap);
上面是單獨(dú)的他其實(shí)需要子線程進(jìn)行加載
詳細(xì)問(wèn):網(wǎng)絡(luò)/本地視頻第一幀圖片:http://www.lxweimin.com/p/bd308c8371dd
我寫(xiě)了一個(gè)緩存視屏圖片的工具類(lèi)
package com.Image_Utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Environment;
import android.support.v4.content.FileProvider;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
/**
* Created by Administrator on 2018/9/7 0007.
*/
public class MediaUtils
{
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
public static File file;
/**
*創(chuàng)建用于保存圖像或視頻的文件URI
*/
public static Uri getOutputMediaFileUri(Context context, int type)
{
Uri uri = null;
//適配Android N
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
{
return FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", getOutputMediaFile(type));
} else
{
return Uri.fromFile(getOutputMediaFile(type));
}
}
/**
* 創(chuàng)建保存圖像或視頻的文件
*/
public static File getOutputMediaFile(int type)
{
// 為了安全起見(jiàn),您應(yīng)該檢查SD卡是否已安裝。
//在執(zhí)行此操作之前,使用Enguly.GutExalStReAgAgestEATE()。
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "image");
// 如果希望創(chuàng)建的圖像共享,則此位置最有效。
// 在應(yīng)用程序之間并在卸載應(yīng)用程序后繼續(xù)執(zhí)行。
// 如果存儲(chǔ)目錄不存在,則創(chuàng)建存儲(chǔ)目錄
if (!mediaStorageDir.exists())
{
if (!mediaStorageDir.mkdirs())
{
return null;
}
}
// 創(chuàng)建媒體文件名
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE)
{
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_" + timeStamp + ".jpg");
} else if (type == MEDIA_TYPE_VIDEO)
{
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"VID_" + timeStamp + ".mp4");
} else
{
return null;
}
file = mediaFile;
return mediaFile;
}
/**
* 獲取視頻的第一幀圖片
*/
public static void getImageForVideo(String videoPath, OnLoadVideoImageListener listener)
{
LoadVideoImageTask task = new LoadVideoImageTask(listener);
task.execute(videoPath);
}
public static class LoadVideoImageTask extends AsyncTask<String, Integer, File>
{
private OnLoadVideoImageListener listener;
public LoadVideoImageTask(OnLoadVideoImageListener listener)
{
this.listener = listener;
}
@Override
protected File doInBackground(String... params)
{
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
String path = params[0];
if (path.startsWith("http"))
//獲取網(wǎng)絡(luò)視頻第一幀圖片
mmr.setDataSource(path, new HashMap());
else
//本地視頻
mmr.setDataSource(path);
Bitmap bitmap = mmr.getFrameAtTime();
//保存圖片
File f = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (f.exists())
{
f.delete();
}
try
{
FileOutputStream out = new FileOutputStream(f);
if(bitmap==null){
return null;
}
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
mmr.release();
return f;
}
@Override
protected void onPostExecute(File file)
{
super.onPostExecute(file);
if (listener != null)
{
listener.onLoadImage(file);
}
}
}
public interface OnLoadVideoImageListener
{
void onLoadImage(File file);
}
}
使用
MediaUtils.getImageForVideo(contentlistBean.getVideo_uri(), new MediaUtils.OnLoadVideoImageListener() {
@Override
public void onLoadImage(File file) {
mMVideoUriItem.thumbImageView.setImageBitmap(BitmapFactory.decodeFile(file.getPath()));
}
});
效果圖
image.png