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

相关文章

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 中手

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.