Android 获取视频(本地、网络)的第一关键帧
来源:互联网 发布:用java写自我介绍 编辑:程序博客网 时间:2024/06/06 00:15
前言: 今日付出的汗水,只为明日不一样的自己。唯有坚持不懈的努力,才能过上自己想要的生活转载请标明出处:
http://blog.csdn.net/w690333243/article/details/78593654
更多内容请访问【-小沫-专栏】
可以获取网络视频,本地视频第一帧
使用:
imageView.setImageBitmap(ImageUtil.createVideoThumbnail(urlPath,MediaStore.Images.Thumbnails.MINI_KIND));
public static Bitmap createVideoThumbnail(String filePath, int kind) { Bitmap bitmap = null; MediaMetadataRetriever retriever = new MediaMetadataRetriever(); try { if (filePath.startsWith("http://") || filePath.startsWith("https://") || filePath.startsWith("widevine://")) { retriever.setDataSource(filePath, new Hashtable<String, String>()); } else { retriever.setDataSource(filePath); } bitmap = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); //retriever.getFrameAtTime(-1); } catch (IllegalArgumentException ex) { // Assume this is a corrupt video file ex.printStackTrace(); } catch (RuntimeException ex) { // Assume this is a corrupt video file. ex.printStackTrace(); } finally { try { retriever.release(); } catch (RuntimeException ex) { // Ignore failures while cleaning up. ex.printStackTrace(); } } if (bitmap == null) { return null; } if (kind == MediaStore.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 == MediaStore.Images.Thumbnails.MICRO_KIND) { bitmap = ThumbnailUtils.extractThumbnail(bitmap, 96, 96, ThumbnailUtils.OPTIONS_RECYCLE_INPUT); } return bitmap; }
其中压缩图片处的代码可以换成这个 bitmap = compressImage(bitmap); 在网上搜索到的质量压缩
/** * 质量压缩方法 * * @param image * @return */ public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 90; while (baos.toByteArray().length / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩 baos.reset(); // 重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中 options -= 10;// 每次都减少10 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片 return bitmap; }
查看源码可以发现
//查看源码可以看到,retriever.setDataSource(filePath, new Hashtable<String, String>());如果setDataSource方法传递了Hashtable,会调用 _setDataSource( MediaHTTPService.createHttpServiceBinderIfNecessary(uri), uri, keys, values); 既然用到了MediHTTPService,http中的东西,肯定和网络有关了。所以可以获取到网络视频的第一帧
如果是本地视频,直接使用
MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(videoFilePath); Bitmap bmp = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); imageView.setImageBitmap(bmp);
即可。
对于本地视频,如下方式只能获取到最大关键帧
Bitmap bmp = ThumbnailUtils.createVideoThumbnail(filePath, MediaStore.Images.Thumbnails.MINI_KIND);imageView.setImageBitmap(bmp);
另外网上很多说 使用MediaMetadataRetriever的拓展类:FFmepgMediaMetadataRetriever来取更多格式的视频文件缩略图,还没有尝试,大家可以尝试下。
我在录制视频后,显示视频第一帧的过程中报错(这里介绍处理问题的方法)
java.lang.RuntimeException: setDataSource failed: status = 0xFFFFFFEA and I'd like to know what this status is. I'm using the function MediaMetaDataRetriever.setDataSource(String filePath)
当我看到这个异常后,第一反应就是网上搜索这个异常,但是一直没找到合适的答案。
其实看到这个异常后的第一步应该是看自己录制的视频是否正常,因为显示视频第一帧的方法是没有问题的,如果录制的视频就不正常,肯定显示不出来第一帧,而且会报异常,但是如果你去分析这个异常的话,是很难分析出来的(如果视频录制的正常),但是恰好是录制的视频不正常引起的。
录制视频时使用1280 * 720的分辨率后,录制视频正常。之前使用的是640*480 结果视频没录制成功
startInput(472) failed: other input 468 already started 在使用audioRecord.startRecording()方法时,提示此错误(不是抛出的异常),是因为上次录音没有很好的释放资源引起的
参考http://blog.csdn.net/ffb920724/article/details/75430922
http://blog.csdn.net/xiaxl/article/details/67637030
- Android 获取视频(本地、网络)的第一关键帧
- 获取视频的第一帧缩略图(本地视频、网络视频)
- android 获取本地视频第一帧
- 获取本地视频,网络视频的第一帧图片,使之显示出来
- 获取本地视频,网络视频的第一帧图片,使之显示出来
- 如何获取网络视频(或者说后台返回视频URL)第一帧图片以及获取本地视频的第一帧图片
- 如何获取网络视频(或者说后台返回视频URL)第一帧图片以及获取本地视频的第一帧图片
- Android 获取视频(本地和网络)缩略图的解决方案
- 获取本地视频缩略图,既第一帧图片的方法
- 获取url或本地视频的第一帧
- 如何获取本地,网络视频的缩略图
- ThumbnailUtils.createVideoThumbnail 获取到的帧不是视频第一个关键帧
- FFmpeg获取是视频的关键帧
- 获取视频的第一帧
- Android 获取视频第一帧缩略图
- Android -- 获取视频第一帧缩略图
- Android -- 获取视频第一帧缩略图
- ffmpeg 获取视频关键帧
- java虚拟机(四)--垃圾回收算法与垃圾收集器
- reportico工具和Yii整合,并解决Projects area does not exist
- Android 硬解码 MediaCodec 遇到的(部分手机绿屏)API21
- Leetcode88 MergeSortedArray
- linux 编译链接
- Android 获取视频(本地、网络)的第一关键帧
- 炉石传说卡
- 常见的亮灭屏流程分析
- iOS开发
- *ngif 和 显示隐藏的区别
- C/C++:二叉树的各种遍历(前序,中序,后序,层次)(一)
- 欢迎使用CSDN-markdown编辑器
- kotlin初探mvp架构
- 浅谈socket同步和异步、阻塞和非阻塞、I/O模型_php技巧