Android获取多个在线视频的略缩图

2024-06-01 06:18

本文主要是介绍Android获取多个在线视频的略缩图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章参考:
  • (1)、http://stackoverflow.com/questions/13743223/it-is-possible-to-display-a-video-thumbnail-from-a-url-on-android-4-and-above
  • (2)、http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html
  • 开源工具参考:
    https://github.com/wseemann/FFmpegMediaMetadataRetriever

1、熟悉加载视频略缩图的工具

用android自带的方法无法加载在线视频的略缩图,就像参考的第一个网址里面提的问题一样,用这条语句来实现,ThumbnailUtils.extractThumbnail(ThumbnailUtils.createVideoThumbnail(objectURL[0], Thumbnails.MINI_KIND), 100, 100);但是不成功。后面有人回复说:Use FFmpegMediaMetadataRetriever to extract a thumbnail at the desired position: www.github.com/wseemann/FFmpegMediaMetadataRetriever。自此知道可以使用这个开源工具来加载在线视频略缩图(其实来自于FFmpeg)。
下载这个网站提供的包(https://github.com/wseemann/FFmpegMediaMetadataRetriever/blob/master/fmmr-library/prebuilt-libs.tar.gz),解压后发现有一个“fmmr-demo”的文件夹,这个就是官方的demo,此时将其libs文件夹下的fmmr.jar和armeabi文件夹复制到自己android工程的libs目录下就行了,其余平台下的so库视具体情况添加。

  • 更新(2019/4/17):这个下载链接已经无法打开,请在github下载:
    https://github.com/cg229836277/RelativesChat/tree/master/RelativesChat/libs

将这个“fmmr-demo”下的android工程导入eclipse下看一下他的代码是如何实现加载视频的略缩图的,其实现代码如下:

FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever();
try {fmmr.setDataSource(mUri);for (int i = 0; i < Constants.METADATA_KEYS.length; i++) {String key = Constants.METADATA_KEYS[i];String value = fmmr.extractMetadata(key);if (value != null) {metadata.add(new Metadata(key, value));Log.i(MetadataLoader.class.getName(), "Key: " + key + " Value: " + value);}}Bitmap b = fmmr.getFrameAtTime();if (b != null) {Bitmap b2 = fmmr.getFrameAtTime(4000000,FFmpegMediaMetadataRetriever.OPTION_CLOSEST_SYNC);if (b2 != null) {b = b2;}}
} catch(Exception e){
}

中间有些代码不用去看,只需要关心三行代码并且在源码FFmpegMediaMetadataRetriever.java中有详细解释:

2、加载单个在线视频的略缩图

熟悉了上面的方法之后,现在就要写加载视频略缩图的方法了,代码如下:

public Bitmap getVideoThumbnail(String videoUrl){Bitmap generateBitmap = null;FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever();try {fmmr.setDataSource(videoUrl);generateBitmap = fmmr.getFrameAtTime();if (generateBitmap != null) {Bitmap b2 = fmmr.getFrameAtTime(4000000,FFmpegMediaMetadataRetriever.OPTION_CLOS EST_SYNC);if (b2 != null) {//获取到了Bitmap之后用android自带的ThumbnailUtils获取自定义大小的略缩图generateBitmap = ThumbnailUtils.extractThumbnail(b2,640, 640,ThumbnailUtils.OPTIONS_RECYCLE_INPUT);}}} catch (IllegalArgumentException ex) {ex.printStackTrace();} finally {fmmr.release();}if(generateBitmap != null){return generateBitmap;}return null;
}

将这个方法封装到自己的工具类中就可以加载单个在线视频的略缩图了。

3、加载多个视频的略缩图

对于项目需要从服务器上面获取多个视频的略缩图,并且这些略缩图是放在ListView里面展示,问题来了,ListView显示多张图片在滑动的时候容易发生显示错乱,以及OOM,针对这个问题参考了google大神的博客,并且是android的官方博客(http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html),里面详细的分析了各个方法的使用,并且有完整源码可供下载,并且对于加载Bitmap的各种问题,参考了android官方文档,即android Training下的文章(http://developer.android.com/training/displaying-bitmaps/index.html)。
现在将博客中的方法整合成自己的工具类用来加载多个在线视频的略缩图,在原来的方法中修改了三个方法:

/**
* @author Chuck Chan
* @date 2014-10-28 下午4:48:56
* @param url 要加载资源的地址
* @param imageView 显示略缩图的ImageView控件
*/
public void loadVideoBitmap(String url, ImageView imageView) {//缓存中的BitmapBitmap bitmap = getBitmapFromCache(url);//缓存中不存在就从网络上获取资源if (bitmap == null) {forceDownload(url, imageView);} else {imageView.setVisibility(View.VISIBLE);cancelPotentialDownload(url, imageView);      //imageView.setTag(bitmap);imageView.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap, 72,72));}
}
/**
* @author Chuck Chan
* @date 2014-10-28 下午4:53:49
* @param url 资源地址
* @param imageView 加载略缩图的ImageView控件
*/
private void forceDownload(String url, ImageView imageView) {// State sanity: url is guaranteed to never be null in DownloadedDrawable and cache keys.if (url == null) {imageView.setImageDrawable(null);return;}//判断是否需要下载if (cancelPotentialDownload(url, imageView)) {imageView.setVisibility(View.VISIBLE);BitmapWorkerTask task = new BitmapWorkerTask(imageView);Bitmap defaultBimap = BitmapFactory.decodeStream(mContext.getResources().openRawResource(R.drawable.user_icon_default));AsyncDrawable downloadedDrawable = new AsyncDrawable(mContext.getResources() , defaultBimap , task);imageView.setImageDrawable(downloadedDrawable);imageView.setMinimumHeight(72);task.execute(url);}
}
class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {private final WeakReference<ImageView> imageViewReference;private String url;public BitmapWorkerTask(ImageView imageView) {// Use a WeakReference to ensure the ImageView can be garbage collectedimageViewReference = new WeakReference<ImageView>(imageView);}@Overrideprotected Bitmap doInBackground(String... params) {url = params[0];//获取在线视频的帧的图像,返回BitmapBitmap tempBitmap = getVideoThumbnail(url);return tempBitmap;}@Overrideprotected void onPostExecute(Bitmap bitmap) {if (isCancelled()) {bitmap = null;}addBitmapToCache(url, bitmap);if (imageViewReference != null && bitmap != null) {final ImageView imageView = imageViewReference.get();final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);//判断当前的异步对象是否与ImageView所在的异步对象是否相等,以此来防止加载错乱if (this == bitmapWorkerTask && imageView != null) {             //             imageView.setTag(bitmap);imageView.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap, 72,72));}}}
}

将google博客中的方法结合自己修改的方法封装到工具类中,方便以后复用。

这篇关于Android获取多个在线视频的略缩图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020202

相关文章

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061