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

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

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

  1. java 将avi视频转换为mp4格式并获取视频文件信息

    引入jar包 <!-- https://mvnrepository.com/artifact/ws.schild/jave-all-deps --><dependency>&l ...

  2. 【FFmpeg】java实现利用ffmpeg视频上传转码同时截取一帧保存为同名图片,并获取视频分辨率

    〇.前情提要 完成了视频上传,接下来是给上传的视频保存一张同名的jpg文件在同样文件夹中,并且获取到视频的分辨率. macOS Catalina 10.15.1 ffmpeg version 4.3. ...

  3. android开机图片格式,Android平台启动图使用.9.png图片

    概述 目前HBuilder|HBuilderX中仅定义几种标准分辨率的启动图配置,而实际上存在很多不同分辨率的手机,导致启动图会进行拉伸或压缩引起变形,Android平台为了解决此问题就出现了可以适配 ...

  4. 私人笔记 -- 将图片插入到指定的单元格位置,并设置图片的宽度和高度

    /// <summary> /// 将图片插入到指定的单元格位置,并设置图片的宽度和高度. /// 注意:图片必须是绝对物理路径 /// </summary> /// < ...

  5. android 相册选择视频和图片格式,Android获取文件类型是图片还是视频

    我们开发从相册分享图片到App的功能,开发完成后发现一个问题:我们设置的是用户可以选择多张图片到app,但是有一种情况是有的手机可以分享一张图片和一个视频,尴尬的是我们不支持视频分享.这就需要区分用户 ...

  6. Android之使用ThumbnailUtils类来获取视频第一帧缩略图

    一.首先,来介绍ThumbnailUtils类,此类位于android.media包下,此类有一个公有的无参构造函数,有三个静态的公有方法,一个用来获取视频第一帧得到的Bitmap,另外两个方法用 ...

  7. android开发用百度识别图片格式,Android开发学习之路-机器学习库(图像识别)、百度翻译...

    对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...

  8. android开发图片格式,Android程序开发如何处理图像格式类及图像转换

    在Android程序开发过程中,明确哪些图像格式类(ImageFormat.PixelFormat及BitmapConfig等)及图像(JPG.PNG及BMP等)的转换方式非常重要,在以后的程序开发过 ...

  9. android webp转换jpg格式,Android使用webp格式图片的步骤

    webp是Android推荐使用的一种图片格式,内存占用很小.使用webp图片是app瘦身和内存优化的很好的方式之一. 下面是webp的使用步骤介绍: 1.下载webp工具,这个google提供给我们 ...

最新文章

  1. Python学习之使用Python生成PDF报告
  2. python 列表推导式 - 列表字典取value
  3. 利用cmake查看OpenCV的源码的方法
  4. Xamarin.Android 使用 Encoding.GetEncoding(GB2312) 报错解决方案
  5. 揭开“云杀毒”的真面目
  6. 如何上传本地文件到github又如何删除自己的github仓库
  7. using(){},Close(),Dispose()的区别
  8. 11 、图解2个node环境下replica shard是如何分配的
  9. Java基础语法实例(2)——实习第二天
  10. cmd下载ftp文件
  11. python的类,复现assert和eval成功失败原因
  12. 还在为word排版而发愁?word的实验报告模板word数学建模模板免费领~(开头直接放百度网盘链接,直接拿去用就行)
  13. CRC冗余校验的真正原理之模2除法
  14. word怎样删除向下的箭头“↓”
  15. Git如何合并分支到主干及合并主干到分支
  16. Linux下rsh服务配置
  17. BurpSuite抓包出现建立安全连接失败(Software is Preventing Firefox From Safely Connecting to This Si)
  18. YOLOv7来临:论文解读附代码解析
  19. vue tsx render函数 transition动画不生效
  20. windows+ffmpeg+qsv实现inter核显加速视频解码编码

热门文章

  1. 解决Jupyter notebook安装后不自动跳转网页的方法
  2. 领域模型中分散的事务如何集中统一处理(C#解决方案)
  3. layui表格点击排序按钮后,表格绑定事件失效解决方法
  4. LSTM 时间序列数据的异常检测
  5. vue 上传图片视频组件,可拍照选择照片,解决苹果手机拍照旋转问题
  6. 项目pom.xml第一行报错解决方案
  7. 深入全面探究有未经处理的异常: 0xC00000FD: Stack overflow(栈溢出)问题!
  8. C# 出现System.TypeInitializationException类型初始值设定项引发异常
  9. SQL Server 2008还原数据库时出现“备份集中的数据库备份与现有的数据库不同”的解决方法
  10. 阿里云ECS使用SSH连接CentOS 6.9经常断线的问题解决:OperationTimedOut