获取视频的第一帧缩略图(本地视频、网络视频)
来源:互联网 发布:练钢琴软件 编辑:程序博客网 时间:2024/05/17 06:21
在开发中,对视频进行操作,将视频显示在界面上时,都是显示的视频的第一帧的图片。比如,在录制视频上传(上传界面)、下载视频(视频下载列表);这两个功能我的项目中都用到了,这两个需求刚好是获取视频的第一帧的图片的两种视频形式(本地视频、网络视频)。
1.MediaMetadataRetrieve
从API10开始新增的这个类,用来获取媒体文件的信息,比如视频的某一帧。
具体运用代码如下:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();//获取网络视频retriever.setDataSource(url, new HashMap<String, String>());//获取本地视频//retriever.setDataSource(url);Bitmap bitmap = retriever.getFrameAtTime();FileOutputStream outStream = null;outStream = new FileOutputStream(new File(mActivity.getExternalCacheDir().getAbsolutePath() + "/" + videoName + ".jpg"));bitmap.compress(Bitmap.CompressFormat.JPEG, 10, outStream);outStream.close();retriever.release();
获取网络视频只是在setDataSource方法中,多传入了一个HashMap的参数。
下面是这个方法的源码
public void setDataSource(String uri, Map<String, String> headers) throws IllegalArgumentException { int i = 0; String[] keys = new String[headers.size()]; String[] values = new String[headers.size()]; for (Map.Entry<String, String> entry: headers.entrySet()) { keys[i] = entry.getKey(); values[i] = entry.getValue(); ++i; } _setDataSource( MediaHTTPService.createHttpServiceBinderIfNecessary(uri), uri, keys, values);}
注意:(1)、这些操作需要网络权限,读写sd卡的权限。
(2)、在获取网络视频的第一帧的缩略图时,最好不要在主线程中进行,耗时过长容易造成ANR。
(3)、compress这个方法,我传入的quality是10,将图片质量压缩到原来十分之一,因为我是在视频下载列表中需要这张缩略图,并不要求多高的质量。
2、ThumbnailUtils
从API8开始新增了android.media.ThumbnailUtils这个类
这个类有三个静态的方法。
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(url, MediaStore.Images.Thumbnails.MINI_KIND);
这个方法直接就能获取本地视频的第一帧,第一个参数是本地视频的地址,第二个是获取到的缩略图的大小。
extractThumbnail(Bitmap source, int width, int height, int options)extractThumbnail(Bitmap source, int width, int height)
另外两个方法是对bitmap进行处理的。这个类不能获取网络视频的缩略图。
createVideoThumbnail方法其实也是用的MediaMetadataRetriever,对它重新进行的封装。
源码如下:
public static Bitmap createVideoThumbnail(String filePath, int kind) { Bitmap bitmap = null; MediaMetadataRetriever retriever = new MediaMetadataRetriever(); try { retriever.setDataSource(filePath); bitmap = retriever.getFrameAtTime(-1); } catch (IllegalArgumentException ex) { // Assume this is a corrupt video file } catch (RuntimeException ex) { // Assume this is a corrupt video file. } finally { try { retriever.release(); } catch (RuntimeException ex) { // Ignore failures while cleaning up. } } if (bitmap == null) return null; if (kind == Images.Thumbnails.MINI_KIND) { // Scale down the bitmap if it's too large. int width = bitmap.getWidth(); int height = bitmap.getHeight(); int max = Math.max(width, height); if (max > 512) { float scale = 512f / max; int w = Math.round(scale * width); int h = Math.round(scale * height); bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true); } } else if (kind == Images.Thumbnails.MICRO_KIND) { bitmap = extractThumbnail(bitmap, TARGET_SIZE_MICRO_THUMBNAIL, TARGET_SIZE_MICRO_THUMBNAIL, OPTIONS_RECYCLE_INPUT); } return bitmap;}
参考 http://www.linuxidc.com/Linux/2014-08/104986.htm
2 0
- 获取视频的第一帧缩略图(本地视频、网络视频)
- 如何获取本地,网络视频的缩略图
- 获取本地视频缩略图,既第一帧图片的方法
- ios开发之Swift获取视频截图(本地视频、网络视频的缩略图)(转)
- Swift - 获取视频截图(本地视频、网络视频的缩略图)
- ios开发之Swift获取视频截图(本地视频、网络视频的缩略图)
- Android 获取视频(本地和网络)缩略图的解决方案
- 获取本地视频缩略图
- 获取网络视频缩略图
- Android 获取视频(本地、网络)的第一关键帧
- 如何获取网络视频(或者说后台返回视频URL)第一帧图片以及获取本地视频的第一帧图片
- 如何获取网络视频(或者说后台返回视频URL)第一帧图片以及获取本地视频的第一帧图片
- 获取本地视频,网络视频的第一帧图片,使之显示出来
- 获取本地视频,网络视频的第一帧图片,使之显示出来
- iOS 获取本地视频的缩略图
- iOS 获取本地视频的缩略图
- OS 获取本地视频的缩略图
- iOS获取本地视频和网络URL视频的缩略图方法
- 选择排序
- 30 天学习 30 种新技术
- c++编程四舍五入算法
- listview设置数据为空时显示数据
- CDI进阶第十步 查找上下文
- 获取视频的第一帧缩略图(本地视频、网络视频)
- java网络编程
- java中Keytool的使用总结
- Dynamics CRM Plugin DLL恢复工具
- 笨办法学Python学习笔记 练习17
- Educational Codeforces Round 5 B. Dinner with Emma
- 如何用 React Native 创建一个iOS APP?(二)
- Android Gradle Plugin指南(一)
- tcpdump捕包乱序的解决方案