android 视频默认图片格式,Android获取视频文件某一帧并设置图片

在项目中,有时候需要抓取视频文件的某一帧图像做为预览图片,那到底应该怎么获取这个图片呢?

Android为我们提供了一个统一的接口用来获取多媒体文件的相关信息:MediaMetadataRetriever;

创建MediaMetadataRetriever对象`

MediaMetadataRetriever mmr=new MediaMetadataRetriever();

设置资源位置

String path="/storage/sdcard1"+"/Movies"+"/XiaomiPhone.mp4";

绑定资源

mmr.setDataSource(path);

//获取第一帧图像的bitmap对象

Bitmap bitmap=mmr.getFrameAtTime();

//加载到ImageView控件上

img.setImageBitmap(bitmap);

上面是单独的他其实需要子线程进行加载

详细问:网络/本地视频第一帧图片:https://www.jianshu.com/p/bd308c8371dd

我写了一个缓存视屏图片的工具类

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;

/**

*创建用于保存图像或视频的文件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));

}

}

/**

* 创建保存图像或视频的文件

*/

public static File getOutputMediaFile(int type)

{

// 为了安全起见,您应该检查SD卡是否已安装。

//在执行此操作之前,使用Enguly.GutExalStReAgAgestEATE()。

File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(

Environment.DIRECTORY_PICTURES), "image");

// 如果希望创建的图像共享,则此位置最有效。

// 在应用程序之间并在卸载应用程序后继续执行。

// 如果存储目录不存在,则创建存储目录

if (!mediaStorageDir.exists())

{

if (!mediaStorageDir.mkdirs())

{

return null;

}

}

// 创建媒体文件名

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

{

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"))

//获取网络视频第一帧图片

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()));

}

});

效果图

3369976a8491

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值