android 获取视频第一帧作为缩略图的方法

今天,简单讲讲android里如何获取一个视频文件的第一帧作为缩略图显示在界面上。

之前,我说个最近需要从服务器下载视频文件,但是下载后肯定需要显示视频的缩略图在界面上给用户看,于是想到显示视频的第一帧作为缩略图。但是我不知道具体怎么写,于是在网上查找资料,最终是解决了问题。这里记录一下。

一.使用MediaMetadataRetriever获取视频的第一帧作为缩略图

/**
* 获取视频文件截图
*
* @param path 视频文件的路径
* @return Bitmap 返回获取的Bitmap
*/

public static Bitmap getVideoThumb(String path) { 

MediaMetadataRetriever media = new MediaMetadataRetriever(); 

media.setDataSource(path); 

return media.getFrameAtTime(); 

}

这里需要注意一点,从API 10开始新增一类MediaMetadataRetriever可以用来获取媒体文件的信息,可以获取视频任何一帧的缩略图。所以使用MediaMetadataRetriever的API最小为10.

这里还列举一下MediaMetadataRetriever获取视频的其他几个函数:

//获取第一帧原尺寸图片
mmrc.getFrameAtTime();

//获取指定位置的原尺寸图片 注意这里传的timeUs是微秒
mmrc.getFrameAtTime(timeUs, option);

//获取指定位置指定宽高的缩略图
mmrc.getScaledFrameAtTime(timeUs, MediaMetadataRetrieverCompat.OPTION_CLOSEST, width, height);

//获取指定位置指定宽高并且旋转的缩略图
mmrc.getScaledFrameAtTime(timeUs, MediaMetadataRetrieverCompat.OPTION_CLOSEST, width, height, rotate);

这里简单讲讲,media.getFrameAtTime()实际上也是调用mmrc.getFrameAtTime(-1, OPTION_CLOSEST_SYNC );即获取从-1秒后最近位置的关键帧,其实就是第一帧数据。下面简单说一下public Bitmap getFrameAtTime(long timeUs, int option):

public Bitmap getFrameAtTime(long timeUs, int option) 第一个参数是传入时间,只能是us(微秒) ,当时我传入的ms,获取的总是第一帧,所以这个问题都弄了好久。

然后是第二个参数,先看看官方解释:

OPTION_CLOSEST   在给定的时间,检索最近一个帧,这个帧不一定是关键帧。

OPTION_CLOSEST_SYNC   在给定的时间,检索最近一个同步与数据源相关联的的帧(关键帧)。

OPTION_NEXT_SYNC  在给定时间之后检索一个同步与数据源相关联的关键帧。

OPTION_PREVIOUS_SYNC   顾名思义,同上

二.使用ThumbnailUtils获取视频的第一帧作为缩略图

/**
   * 获取视频的缩略图
   * 先通过ThumbnailUtils来创建一个视频的缩略图,然后再利用ThumbnailUtils来生成指定大小的缩略图。
   * 如果想要的缩略图的宽和高都小于MICRO_KIND,则类型要使用MICRO_KIND作为kind的值,这样会节省内存。
   * @param videoPath 视频的路径
   * @param width 指定输出视频缩略图的宽度
   * @param height 指定输出视频缩略图的高度度
   * @param kind 参照MediaStore.Images(Video).Thumbnails类中的常量MINI_KIND和MICRO_KIND。
   *      其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96
   * @return 指定大小的视频缩略图
   */
  public static Bitmap getVideoThumbnail(String videoPath, int width, int height,int kind) {
    Bitmap bitmap = null;
    // 获取视频的缩略图
    bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind); //調用ThumbnailUtils類的靜態方法createVideoThumbnail獲取視頻的截圖;
    if(bitmap!= null){
      bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
          ThumbnailUtils.OPTIONS_RECYCLE_INPUT);//調用ThumbnailUtils類的靜態方法extractThumbnail將原圖片(即上方截取的圖片)轉化為指定大小;
    }
    return bitmap;
  }

简单讲讲,这个其实很简单,就是调用ThumbnailUtils.createVideoThumbnail(path, kind)获取第一帧数据,然后通过bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);将图片转成指定大小。

下面还列举如何将bitmap保存到文件,因为获取到视频的缩略图后,可能需要保存到本地,下次进入app时可以直接查看。

/**
* Bitmap保存成File
*
* @param bitmap input bitmap
* @param name output file's name
* @return String output file's path
*/

public static String bitmap2File(Bitmap bitmap, String name) { 

File f = new File(Environment.getExternalStorageDirectory() + name + ".jpg"); 

if (f.exists()) f.delete(); 

FileOutputStream fOut = null; 

try { 

fOut = new FileOutputStream(f); 

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut); 

fOut.flush(); 

fOut.close(); 

} catch (IOException e) { 

return null; 

} 

return f.getAbsolutePath(); 

}

android 获取视频第一帧作为缩略图就讲完了。

就这么简单。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android raw 目录下视频的缩略图的获取

     Android raw 目录下视频的缩略图的获取 以下代码用于获取 Android raw目录下视频文件的缩略图: /** * 获取 raw 下 指定视频文件的缩略图 * @param aVideoName * @return */ private Drawable getThumbnail(String aVideoName) { Drawable ret = null; int id = 0; try { id = R.raw.class.getDeclaredField(aVideoNa

  • Android获取SD卡上图片和视频缩略图的小例子

    如何判断文件呢? 可以通过Cursor遍历数据库,对比INTERNAL_CONTENT_URI字段的值,这是一个Uri,这里保存着Android手机SD卡上的多媒体文件完整路径. [java] 复制代码 代码如下: Uri originalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;                 //若为视频则为MediaStore.Video.Media.EXTERNAL_CONTENT_URI;          

  • Android 使用Vitamio打造自己的万能播放器(10)—— 本地播放 (缩略图、视频信息、视频扫描服务)

    前言 Vitamio是我们团队的诚意之作,除了要将VPlayer打造成Android最好的播放器,也要将Vitamio打造成Android最好的播放器组件.新版发布内测SDK虽然还有一些问题,但已经具备高可扩展性.便捷性和许多内置实用的功能,后续文章将继续深挖和介绍Vitamio的使用细节和方法.本章将提供显示缩略图.视频大小等视频信息,并介绍使用Vitamio内置的ContentProvider以及文件扫描服务. 注意 本章ContentProvider在2012-8-31发布的SDK中已经不

  • android 获取视频,图片缩略图的具体实现

    1.获取视频缩略图有两个方法(1)通过内容提供器来获取(2)人为创建缩略图 (1)缺点就是必须更新媒体库才能看到最新的视频的缩略图 [java] 复制代码 代码如下: /**      * @param context      * @param cr     * @param Videopath     * @return      */     public static Bitmap getVideoThumbnail(Context context, ContentResolver cr

  • Android编程获取图片和视频缩略图的方法

    本文实例讲述了Android编程获取图片和视频缩略图的方法.分享给大家供大家参考,具体如下: 从Android 2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位 置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取. 1. createVideoThumbnail static Bitmap createVideoThumbnail(

  • Android中如何获取视频文件的截图、缩略图

    背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取视频文件截图 * * @param path 视频文件的路径 * @return Bitmap 返回获取的Bitmap */ public static Bitmap getVideoThumb(String path) { MediaMetadataRetriever media = new Me

  • android 获取视频第一帧作为缩略图的方法

    今天,简单讲讲android里如何获取一个视频文件的第一帧作为缩略图显示在界面上. 之前,我说个最近需要从服务器下载视频文件,但是下载后肯定需要显示视频的缩略图在界面上给用户看,于是想到显示视频的第一帧作为缩略图.但是我不知道具体怎么写,于是在网上查找资料,最终是解决了问题.这里记录一下. 一.使用MediaMetadataRetriever获取视频的第一帧作为缩略图 /** * 获取视频文件截图 * * @param path 视频文件的路径 * @return Bitmap 返回获取的Bit

  • php如何利用ffmpeg获取视频第一帧为缩略图

    目录 phpffmpeg获取视频缩略图 1.环境 2.centos7安装ffmpeg 3.项目安装ffmpeg包 4.php代码 附Fmpeg读取视频信息 总结 php ffmpeg获取视频缩略图 1.环境 centos 7 ffmpeg version 2.8.15 Copyright 2.centos7安装ffmpeg centos7安装ffmpeg sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro sudo

  • Android如何获取视频首帧图片

    Android获取视频首帧图片或第n秒的图片,供大家参考,具体内容如下 这里介绍如何获取视频首帧或者第n秒的图片并保存在本地,直接上代码: import android.graphics.Bitmap; import android.media.MediaMetadataRetriever; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.AppCompatActivit

  • C#获取视频某一帧的缩略图的方法

    本文实例讲述了C#获取视频某一帧的缩略图的方法.分享给大家供大家参考.具体实现方法如下: 读取方式:使用ffmpeg读取,所以需要先下载ffmpeg.网上资源有很多. 原理是通过ffmpeg执行一条命令获取视频某一帧的缩略图. 首先,需要获取视频的帧高度和帧宽度,这样获取的缩略图才不会变形. 获取视频的帧高度和帧宽度可以参考:http://www.jb51.net/article/57475.htm. 获取到视频的帧高度和帧宽度后,还需要获取缩略图的高度和宽度,这是按比例缩放的. 比如你存放缩略

  • vue截取视频第一帧的图片问题

    已拿到视频的url,现在要截取视频的第一帧,作为封面图片. 在网上找了几种,都是空白.稍微改了一下,终于成功了. 基本就是用cavas进行绘制,解决一下跨域问题,截视频第一帧,然后根据视频原本的宽高进行绘制,最后转一下图片格式即可. 代码如下: <template> ...... <video :src="videoSrc" id="upvideo">您的浏览器不支持 video 标签.</video> ...... <sp

  • Android获取本机各种类型文件的方法

    介绍 本篇介绍Android获取本机各种类型文件的方法,已经封装成工具类,末尾有源码下载地址. 提示 获取音乐.视频.图片.文档等文件是需要有读取SD卡的权限的,如果是6.0以下的系统,则直接在清单文件中声明SD卡读取权限即可:如果是6.0或以上,则需要动态申请权限. FileManager的使用 FileManager是封装好的用于获取本机各类文件的工具类,使用方式如:FileManager.getInstance(Context context).getMusics(),使用的是单例模式创建

  • Android获取手机系统版本等信息的方法

    本文实例讲述了Android获取手机系统版本等信息的方法.分享给大家供大家参考.具体如下: String phoneInfo = "Product: " + android.os.Build.PRODUCT; phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI; phoneInfo += ", TAGS: " + android.os.Build.TAGS; phoneInfo += &qu

  • android获取监听SD Card状态的方法

    本文实例讲述了android获取监听SD Card状态的方法.分享给大家供大家参考.具体分析如下: 1. 注册StorageEventListener来监听SD卡状态即onStorageStateChanged()方法,当sd卡状态改变时,调用该方法. 复制代码 代码如下: public void onStorageStateChanged(String path,String oldState,String newState){ if (newState.equals(Environment.

  • 实现Android 获取cache缓存的目录路径的方法

    实现Android 获取cache缓存的目录路径的方法 Android开发中,有时需要知道cache缓存的路径.我写了一个静态类,供大家能参考 public class CommonUtil { /** * 获取cache路径 * * @param context * @return */ public static String getDiskCachePath(Context context) { if (Environment.MEDIA_MOUNTED.equals(Environmen

  • Android获取手机本机号码的实现方法

    Android获取手机本机号码的实现方法 反射TelephoneManager 获取本机号码,注意一下提供的接口有的SIM卡没写是获取不到的,该接口只适配Android5.0以上版本 public String getMsisdn(int slotId) { return getLine1NumberForSubscriber(getSubIdForSlotId(slotId)); } 权限 <uses-permission android:name="android.permission

随机推荐