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

相关文章

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目