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

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Spring Boot中获取IOC容器的多种方式

《SpringBoot中获取IOC容器的多种方式》本文主要介绍了SpringBoot中获取IOC容器的多种方式,包括直接注入、实现ApplicationContextAware接口、通过Spring... 目录1. 直接注入ApplicationContext2. 实现ApplicationContextA

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手