全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

android提取视频多张图片和视频信息实例

话说2016年的|直播|比较火,2017年短视频又火了。但对于开发者来说隐藏在这背后的技术才是我们所关心的,毕竟我们是靠技术吃饭的。

现在在安卓中多媒体服务比较强大,而与视频有关的视频基本处理技术有必要学习一下。我前段时间也在做有关视频的一些需求,当然也涉及本文的标题内容。

经测试和研究发现在android中提取视频图片的方法只有MediaMetadataRetriever这个类比较靠谱简单实用。当然OpenGL-也可以做到哈!(后者不展开介绍),

最后会把完整的demo献上。

效果图

技术需求

  1. 需求一:给你一个视频提取第一个关键帧图片作为视频的封面,好处呢!?就是当没有播放的时候显示视频的首帧图片,当点击播放按钮时(或者自动播放)视频和首帧图片能连惯起来,是个很不错的体验。
  2. 需求二:提取多张图片,用户可以滑动这些缩略图来查看视频的大体内容,然后截取指定的视频区域进行编辑,这个需求类似:微信的小视频编辑界面。这个会在第二篇文章中实现。实现高速度提取视频图片。
  3. 需求三:提取视频的基本信息,比如宽高,视频的时长。这个主要用于上传视频文件时的参数提交,然后展示的时候用视频宽高做UI特效,比如不规则之美-瀑布流

调研

先看第3个问题,这个比较简单。主要是MediaMetadataRetriever这个系统API类。

大体意思就是:给定一个媒体文件,它能检索/输出一些元数据和帧。有点意思哈,它加载了动态库media_jni,可见它是一个十分接近底层的一个类。

技术实现-视频基本信息的获取

看一下类结构,有一些常量,作为一线码农,我懂你哦。


//1.初始化
   mMetadataRetriever = new MediaMetadataRetriever();

//2.设置视频源文件mMetadataRetriever.setDataSource(file.getAbsolutePath());
//3.获取视频的宽
String w = mMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
 //获取视频的高
String h = mMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
 //获取视频的时长,ms
mMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);

// 等等...一些其它属性,比如媒体类型(3gp,mp4) ,视频旋转角度
//4.释放资源,防止内存泄漏,养成好习惯
 mMetadataRetrieve.release();

我自己简单了写了一个util类,最后会献上。

技术实现-获取视频关键帧

直接上代码-我懂你

 public Bitmap extractFrame(long timeMs) {
    //第一个参数是传入时间,只能是us(微秒)
    //OPTION_CLOSEST ,在给定的时间,检索最近一个帧,这个帧不一定是关键帧。
    //OPTION_CLOSEST_SYNC  在给定的时间,检索最近一个同步与数据源相关联的的帧(关键帧)
    //OPTION_NEXT_SYNC 在给定时间之后检索一个同步与数据源相关联的关键帧。
    //OPTION_PREVIOUS_SYNC 在给定时间之前检索一个同步与数据源相关联的关键帧。

// Bitmap bitmap = mMetadataRetriever.getFrameAtTime(timeMs * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
    Bitmap bitmap = null;
    for (long i = timeMs; i < fileLength; i += 1000) {
      bitmap = mMetadataRetriever.getFrameAtTime(i * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
      if (bitmap != null) {
        break;
      }
    }
    return bitmap;
  }

实用的时候直接: Bitmap bitmap = extractFrame(0); fileLength为视频的时长( 毫秒数),返回bitmap ,然后你用可以操作bitmap了,比如保存到sd卡上,看你爱好了。有人问:咿,怎么for循环啊?是这样的,我遇到过有时候你传入的0,它有时候返回的bitmap为null,找不到关键帧,因此你需要多次递增1秒获取。
那么需求一的实现也OK了,但是有一点需要注意就是展示视频的控件的宽和高和盖在上面的图片的控件的宽和高一样才有你播放的时候就连贯了。

技术实现-获取视频多张图片

我相信大家都能想到需求一的for循环一下不就可以了吗,是的,没错。

首先提取图片遇到高清视频可能耗时,我经过测试用vivo-xplay-5a ,1080高清视频,提取一张图片也就是mMetadataRetriever.getFrameAtTime()方法大概90-120ms之间。

  1. 方案:因此你需要一个工作线程+handler,每提取一张保存到sd卡中,然后用handeler发送保存图片的路径展示到UI上。demo中会展示到recycleview上,然后用glide图片加载框架一张一张的显示出来。当然你也可以自己缓存mMetadataRetriever.getFrameAtTime 返回的bitmap,不过不建议这么做。
  2. 怎么循环提取,假设视频文件长度是60s,需要提取10张图片,也就是1张图片代表了6s,60/10,
for (int i = 0; i < thumbnailsCount; i++) {
      if (stop) {
        metadataRetriever.release();
        break;
      }
      long time = startPosition + interval * i;
      if (i == thumbnailsCount - 1) {
        if (interval > 1000) {
          String path = extractFrame(metadataRetriever, endPosition - 800, OutPutFileDirPath);
          sendAPic(path, endPosition - 800);
        } else {
          String path = extractFrame(metadataRetriever, endPosition, OutPutFileDirPath);
          sendAPic(path, endPosition);
        }
      } else {
        String path = extractFrame(metadataRetriever, time, OutPutFileDirPath);
        sendAPic(path, time);
      }
    }

stop是停止提取图片的标志,extractFrame方法就是metadataRetriever.getFrameAtTime()返回bitmap然后 bitmap.compress()返回保存到sd卡上的图片路径,最后sendAPic将提取的图片路径和时间加工为一个对象借助handler更新到UI线程中去,然后展示到recycleview上去,具体代码可以参考demo。这里保存的图片没有进行压缩,第二篇文章会具体讲到。

demo地址:https://github.com/ta893115871/MediaMetadataRetrieverDemo

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


# android提取视频图片  # android视频提取图片  # android提取视频信息  # Android开发之多媒体文件获取工具类实例【音频  # 视频  # 图片等】  # Android多媒体之VideoView视频播放器  # Android多媒体教程之播放视频的四种方法  # Android开发之MediaPlayer多媒体(音频  # 视频)播放工具类  # Android开发实现的IntentUtil跳转多功能工具类【包含视频、音频、图片、摄像头等操作功能  # Android中简单调用图片、视频、音频、录音和拍照的方法  # android 获取视频  # 图片缩略图的具体实现  # Android获取SD卡上图片和视频缩略图的小例子  # Android编程获取图片和视频缩略图的方法  # Android如何获取图片或视频略缩图  # Android编程实现获取多媒体库视频、音频、图片的方法  # 相关联  # 时长  # 第一个  # 视频文件  # 多张  # 卡上  # 懂你  # 加载  # 是个  # 好了  # 给你  # 才是  # 在这  # 是这样  # 都能  # 找不到  # 也在  # 会在  # 它是  # 看你 


相关文章: 最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  济南网站制作的价格,历城一职专官方网站?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  如何选择最佳自助建站系统?快速指南解析优劣  Java解压缩zip - 解压缩多个文件或文件夹实例  PHP正则匹配日期和时间(时间戳转换)的实例代码  太原网站制作公司有哪些,网约车营运证查询官网?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  如何选择网络建站服务器?高效建站必看指南  如何通过免费商城建站系统源码自定义网站主题与功能?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  青岛网站建设如何选择本地服务器?  为什么Go需要go mod文件_Go go mod文件作用说明  SQL查询语句优化的实用方法总结  如何通过云梦建站系统实现SEO快速优化?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  如何快速完成中国万网建站详细流程?  c# 服务器GC和工作站GC的区别和设置  如何续费美橙建站之星域名及服务?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  如何快速搭建二级域名独立网站?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  制作公司内部网站有哪些,内网如何建网站?  如何快速搭建高效可靠的建站解决方案?  如何用西部建站助手快速创建专业网站?  如何用PHP快速搭建CMS系统?  已有域名如何快速搭建专属网站?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  网页设计网站制作软件,microsoft office哪个可以创建网页?  实现虚拟支付需哪些建站技术支撑?  常州自助建站工具推荐:低成本搭建与模板选择技巧  如何在IIS管理器中快速创建并配置网站?  如何挑选最适合建站的高性能VPS主机?  如何快速打造个性化非模板自助建站?  ,如何利用word制作宣传手册?  如何挑选高效建站主机与优质域名?  建站之星代理商如何保障技术支持与售后服务?  定制建站价位费用解析与套餐推荐全攻略  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  建站VPS选购需注意哪些关键参数?  如何批量查询域名的建站时间记录?  建站主机与服务器功能差异如何区分?  如何将凡科建站内容保存为本地文件?  如何在阿里云完成域名注册与建站?  视频网站制作教程,怎么样制作优酷网的小视频? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。