前言: 今日付出的汗水,只为明日不一样的自己。唯有坚持不懈的努力,才能过上自己想要的生活

转载请标明出处:
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());            }            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

更多相关文章

  1. Android实时视频采集方案
  2. webrtc之Android视频质量提升:保帧率降分辨率
  3. 最近遇到的一些Bug的处理
  4. FFmpeg学习—android 利用ffmpeg 录制ogg格式音频文件
  5. 视频教程-Android(安卓)30分钟从零开始到HelloWorld-Android
  6. Android(安卓)VideoView播放视频(1)
  7. AndroidStudio基础视频教程-整理
  8. Ionic2实现自定义Cordova插件-Android屏幕录制
  9. android视频播放简单实现示例(VideoView&MediaPlayer)

随机推荐

  1. 如何在横屏控制软键盘显示一部分
  2. android 一 android 的生命周期
  3. Android configChanges用法
  4. android中ImageView属性及其详解
  5. Android 搜索框:SearchView 的属性和用法
  6. Android 屏幕旋转 处理 AsyncTask 和 Pro
  7. 解决:Android Android requires compiler
  8. 【转】Android兼容性测试CTS --环境搭建
  9. android设备uuid、udid
  10. Android上运行本地c