前言

项目中需求:拖动进度条时,或是在进度条上方或是在屏幕中间,显示拖动进度条位置时刻的某一帧画面

下面是参考文章一中提到(摘抄于)

下面我想到的4个方案:

1、在拖动过程中,可以通过TextureView来显示预览图,拖动进度条到某个position后,通过textureView.getBitmap()拿到对应的截图,用于展示。

2、通过MediaMetadataRetriever 只能获取你指定时间的附近的关键帧(Key frame
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(renderOutputFilePath);
mmr.getFrameAtTime(1x1000x1000,OPTION_CLOSEST_SYNC );//获取1秒附近的关键帧,注意,只是附近,获取不到精确位置的图片。但是用于预览也够了

3、通过GLSurfaceView,拖到到某个事件点后,来onDrawFrame,这种方式比较高效。

4FFmpeg实现,获取某个位置的picturegithub上有封装好的实现此功能的库,类似和MediaMetadataRetriever一样的用法,可以更精准,高效。
链接:https://github.com/wseemann/FFmpegMediaMetadataRetriever,原理就是取某个timebase的关键帧。然后回调出去展示。

下面记录一下自己会用FFmpegMediaMetadataRetriever的简单记录。

好记性不如烂笔头

正文

上面大佬说了四种方式,第一种和第三种

导入配置

implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-arm64-v8a:1.0.14'

部分代码

    private Bitmap getVideoFrame(int duration) {
        try {
            Bitmap bitmap = mFFmpegMediaMetadataRetriever.getFrameAtTime(((long) duration * 1000 * 1000), FFmpegMediaMetadataRetriever.OPTION_NEXT_SYNC);
            if (null != bitmap) {
                return ThumbnailUtils.extractThumbnail(bitmap, 625, 272, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

参考文章

  1. 视频画中画效果,拖动进度条可以seek到相应视频帧显示
  2. 获取视频帧图片,FFmpegMediaMetadataRetriever修改,优化,提高加载速度
  3. Android获取视频的第一帧缩略图(本地视频、网络视频)
  4. [源码探究]ThumbnailUtils.createVideoThumbnail 获取到的帧不是视频第一个关键帧
  5. Android获取视频的关键帧和非关键帧,提取视频封面
  6. Android使用FFmpegMediaMetadataRetriever获取视频缩略图

 历史上的今天

  1. 2024: Android刷新媒体库的方法(0条评论)
  2. 2024: AudioTrack简单使用(1条评论)
  3. 2023: Android截图命令介绍(0条评论)
  4. 2021: Android应用启动时出现白屏或者黑屏问题的简介(0条评论)
  5. 2018: Looper中ThreadLocal的简介(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: https://www.91es.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

LocalServices和SystemService等简介

前言在上次简单介绍SystemServer(《SystenServer的启动之一》)时,里面涉及几个比较重要的类SystemServiceManager,SystemService和LocalServices,因此今天就单独介绍一下。正文涉及文件frameworks\base\servic...

王小波:一只特立独行的猪

插队的时候,我喂过猪、也放过牛。假如没有人来管,这两种动物也完全知道该怎样生活。它们会自由自在地闲逛,饥则食渴则饮,春天来临时还要谈谈爱情;这样一来,它们的生活层次很低,完全乏善可陈。人来了以后,给它们的生活做出了安排:每一头牛和每一口猪的生活都有了主题。就它们中的大多数而言,这种生活主题是很悲惨的...

泰戈尔:你一定要走吗?

旅人,你一定要走吗?夜是静谧的,黑暗昏睡在树林上。露台上灯火辉煌,繁花朵朵鲜丽,年轻的眼睛也还是清醒的。旅人,你一定要走吗?我们不曾以恳求的手臂束缚你的双足,你的门是开着的,你的马上了鞍子站在门口。如果我们设法挡住你的去路,那也不过是用我们的歌声罢了,如果我们曾设法挡住你,那也不过是用...

Vim复制和粘贴命令

前言简单记录一下Vim拷贝和粘贴命令正文dddeletedd是删除光标所在位置的整行内容,并复制到缓存区dd : 删除光标所在的整行内容[N]dd : 删除从光标所在的行开始,联系N行的内容yyYankyy是复制光标所在的整行内容,并复制到缓存区yy : 复制光标所在的整行内...

git revert简单记录

前言git revert是撤销中间某次commit。今天就简单记录部分常用的,方便自己查阅。正文git revert 格式:$ git revert -husage: git revert [<options>] <commit-ish>...   or: git ...

startActivity源码分析2

前言简单记录一下startActivity()源码的启动过程,主要是过一下流程,细节太多顾不上。接上回《startActivity源码分析》,启动新的Activity需要fork一个进程处理,经过一系列的操作,最后进入ActivityThread.java的main(),然后进行绑定进程。这...