全网整合营销服务商

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

免费咨询热线: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编程实现获取多媒体库视频、音频、图片的方法  # 相关联  # 时长  # 第一个  # 视频文件  # 多张  # 卡上  # 懂你  # 加载  # 是个  # 好了  # 给你  # 才是  # 在这  # 是这样  # 都能  # 找不到  # 也在  # 会在  # 它是  # 看你 


相关文章: 如何选择服务器才能高效搭建专属网站?  c# 在高并发场景下,委托和接口调用的性能对比  如何通过VPS搭建网站快速盈利?  七夕网站制作视频,七夕大促活动怎么报名?  文字头像制作网站推荐软件,醒图能自动配文字吗?  已有域名和空间如何搭建网站?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  建站之星如何优化SEO以实现高效排名?  如何在建站之星绑定自定义域名?  如何生成腾讯云建站专用兑换码?  如何用wdcp快速搭建高效网站?  如何用虚拟主机快速搭建网站?详细步骤解析  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何在橙子建站上传落地页?操作指南详解  如何通过虚拟主机快速搭建个人网站?  如何通过远程VPS快速搭建个人网站?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  如何在云服务器上快速搭建个人网站?  如何快速生成高效建站系统源代码?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  如何通过VPS建站实现广告与增值服务盈利?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  存储型VPS适合搭建中小型网站吗?  如何高效完成自助建站业务培训?  南宁网站建设制作定制,南宁网站建设可以定制吗?  建站三合一如何选?哪家性价比更高?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何在IIS服务器上快速部署高效网站?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  中山网站推广排名,中山信息港登录入口?  如何在腾讯云免费申请建站?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  韩国服务器如何优化跨境访问实现高效连接?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何在宝塔面板中创建新站点?  如何在香港服务器上快速搭建免备案网站?  ,巨量百应是干嘛的?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何自定义建站之星网站的导航菜单样式?  建站之星如何防范黑客攻击与数据泄露?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  视频网站制作教程,怎么样制作优酷网的小视频?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  北京的网站制作公司有哪些,哪个视频网站最好?  红河网站制作公司,红河事业单位身份证如何上传? 

您的项目需求

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