IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android音视频开发之三种方式获取视频某一帧封面 -> 正文阅读

[移动开发]Android音视频开发之三种方式获取视频某一帧封面

目录

前言:

1.使用Glide获取视频某一帧:

1.1打断点可以看到bitmap图片信息如下:

1.2 glide输出图片宽高

?

1.3 输出的日志如下:

?

2.使用MediaMetadataRetriever方式获取视频某一帧:

2.1 断点截图如下:

?

2.2 日志打印如下:

?

3.使用TextureView方式获取视频某一帧:

3.1 调试输出图片bitmap信息:

3.2 日志打印图片宽高为:

4.遇到的问题如下:

4.1 使用glide和MediaMetadataRetriever方式时由于时间是微妙所以需要换算成毫秒*1000

4.2 使用glide方式会有延迟获取到的封面优肯不准确

4.3 使用MediaMetadataRetriever方式会出现卡顿现象,由于是网络在线查询,所以网络不好时查询很慢,一般会用rxjava异步去查询,列表不建议用这个。

5.从上面5-1、5-2、5-3的截图可以看出封面是实时显示的,很符合需求视频暂停到那一秒就显示当前某一帧的封面,而且不会出现卡顿.

6.工具类源码如下:

7.总结:以上就是今天的内容,使用三种方式实现获取视频的某一帧,如果小伙伴们有更好的方法欢迎留言,后面有时间会整理出来一个列表播放暂停进入详情页再次返回的demo,谢谢大家!!


前言:

在Android开发中获取视频的某一帧很常见,相信大家都用过腾讯视频、爱奇艺、优酷等,里面会有直播或者播放视频时暂停时显示当前一帧的封面,或者视频暂停时从视频列表进入详情然后再返回时显示之前暂停的界面。今天先说下三种方式实现获取视频某一帧显示封面,然后说遇到的问题.

1.使用Glide获取视频某一帧:

/**
 * 使用Glide方式获取视频某一帧
 * @param context 上下文
 * @param uri 视频地址
 * @param imageView 设置image
 * @param frameTimeMicros 获取某一时间帧.
 */
public static void loadVideoScreenshot(final Context context, String uri, ImageView imageView, long frameTimeMicros) {
 ?  RequestOptions requestOptions = RequestOptions.frameOf(frameTimeMicros);
 ?  requestOptions.set(FRAME_OPTION, MediaMetadataRetriever.OPTION_CLOSEST);
 ?  requestOptions.transform(new BitmapTransformation() {
 ? ? ?  @Override
 ? ? ?  protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
 ? ? ? ? ?  Log.d("--使用glide方式--", "高度为" + toTransform.getHeight() + "寛度为" + toTransform.getWidth());
 ? ? ? ? ?  return toTransform;
 ? ? ?  }
 ? ? ?  @Override
 ? ? ?  public void updateDiskCacheKey(MessageDigest messageDigest) {
 ? ? ? ? ?  try {
 ? ? ? ? ? ? ?  messageDigest.update((context.getPackageName() + "RotateTransform").getBytes("utf-8"));
 ? ? ? ? ?  } catch (Exception e) {
 ? ? ? ? ? ? ?  e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ?  });
 ?  Glide.with(context).load(uri).apply(requestOptions).into(imageView);
}

1.1打断点可以看到bitmap图片信息如下:

1.2 glide输出图片宽高

1.3 输出的日志如下:

2.使用MediaMetadataRetriever方式获取视频某一帧:

/**
 * 使用MediaMetadataRetriever获取视频指定微秒处的帧图片
 * url  网络url
 *timeUs 微秒 
 */
@SuppressLint("LongLogTag")
public static Bitmap GetFramePictures(String url, long timeUs){
 ?  Bitmap videoShortCut = null;
 ?  String width;
 ?  String height;
 ?  MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
 ?  try {
 ? ? ?  if (url != null) {
 ? ? ? ? ?  HashMap<String, String> headers;
 ? ? ? ? ?  headers = new HashMap<>();
 ? ? ? ? ?  headers.put("User-Agent", "Mozilla/5.0 (Linux; U; Android 4.4.2; zh-CN; MW-KW-001 Build/JRO03C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/1.0.0.001 U4/0.8.0 Mobile Safari/533.1");
 ? ? ? ? ?  mediaMetadataRetriever.setDataSource(url, headers);
 ? ? ?  } else {
 ? ? ? ? ?  //mmr.setDataSource(mFD, mOffset, mLength);
 ? ? ?  }
 ? ? ?  videoShortCut = mediaMetadataRetriever.getFrameAtTime(timeUs, MediaMetadataRetriever.OPTION_CLOSEST);
 ? ? ?  width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
 ? ? ?  height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
 ? ? ?  Log.d("--使用MediaMetadata方式--","图片高度为:" + width + "图片宽度为:" + height);
?
 ?  } catch (IllegalArgumentException e) {
 ? ? ?  Log.e("setFrameAtTimeWithView ERROR:" , e.toString(), e);
 ?  }
 ?  mediaMetadataRetriever.release();
 ?  return  videoShortCut;
}

2.1 断点截图如下:

图2-1

?

图2-2

2.2 日志打印如下:

3.使用TextureView方式获取视频某一帧:

public Bitmap getFrontCoverBitmap() {
 ?  Bitmap bitmap = null;
 ?  if (textureView != null) {
 ? ? ?  bitmap = textureView.getBitmap();
 ?  }
 ?  return bitmap;
}

3.1 调试输出图片bitmap信息:

图5-1

?图5-2

图5-3

3.2 日志打印图片宽高为:

4.遇到的问题如下:

4.1 使用glide和MediaMetadataRetriever方式时由于时间是微妙所以需要换算成毫秒*1000

4.2 使用glide方式会有延迟获取到的封面优肯不准确

4.3 使用MediaMetadataRetriever方式会出现卡顿现象,由于是网络在线查询,所以网络不好时查询很慢,一般会用rxjava异步去查询,列表不建议用这个。

5.从上面5-1、5-2、5-3的截图可以看出封面是实时显示的,很符合需求视频暂停到那一秒就显示当前某一帧的封面,而且不会出现卡顿.

6.工具类源码如下:

videotimedemo: 视频播放时间 (gitee.com)

7.总结:以上就是今天的内容,使用三种方式实现获取视频的某一帧,最后选择的是第三种,大家可以根据需要自行选择,如果小伙伴们有更好的方法欢迎留言,后面有时间会整理出来一个列表播放暂停进入详情页再次返回的demo,谢谢大家!!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-06 11:10:03  更:2022-05-06 11:10:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 23:05:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码