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

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

效果图

image.png

更多相关文章

  1. Android(安卓)背景图片重复 Background repeat
  2. android 项目中设置背景图片
  3. android 图片处理工具类,Bitmap转换String ,Drawable, byte[],保存
  4. 【Android性能优化】Android图片加载方案--Bitmap的内存管理和优
  5. tabhost中setup()和setup(LocalActivityManager activityGroup)
  6. Flash移动开发高级教程——创建Anroid & iPhone应用
  7. android上传图片过大处理
  8. Android(安卓)开发中使用 SQLite 数据库
  9. android防新闻循环轮播图效果

随机推荐

  1. android 7.0系统解决拍照的问题android.o
  2. 使用Javaweb开发的WebService部署到Tomca
  3. Android(安卓)复制和粘贴功能
  4. Android模拟用户点击的实现方法
  5. Android(安卓)经验: 本地 5555 端口会被
  6. android api包简要介绍
  7. Android(安卓)Studio打包以及签名
  8. Android中的颜色设置
  9. android framework集成第三方jar包
  10. 在使用ListFragment的setEmptyText时报ja