今天,简单讲讲怎么获取MP4视频的每一帧的图片大小。


android使用 MediaMetadataRetriever 获取视频文件的 总时长 和视频的分辨率。

根据该方式获取视频信息可以看出不仅仅可以获取时长和分辨率,还能获取到其他的一些视频信息,不错还是很强大的,不用自己去解析mp4文件了。此demo只是获取的mp4文件,其他的多媒体文件也可以获取到相应信息,比如mp3;


private void  getPlayTime(String mUri)    {        android.media.MediaMetadataRetriever mmr = new android.media.MediaMetadataRetriever();        try {            if (mUri != null)             {                HashMap headers = null;                if (headers == null)                 {                    headers = new HashMap();                    headers.put("User-Agent", "Mozilla/5.0 (Linux; U; Android 4.4.2; zh-CN; MW-KW-001 Build/JRO03C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/1.0.0.001 U4/0.8.0 Mobile Safari/533.1");                }                mmr.setDataSource(mUri, headers);             //获取网络MP4视频图片的大小            } else             {                //mmr.setDataSource(mFD, mOffset, mLength);            }            String duration = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);//时长(毫秒)            String width = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);//宽            String height = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);//高                        Toast.makeText(MainActivity.this, "playtime:"+ duration+"w="+width+"h="+height, Toast.LENGTH_SHORT).show();        } catch (Exception ex)         {            Log.e("TAG", "MediaMetadataRetriever exception " + ex);        } finally {            mmr.release();        }    }



这里面的代码是通过MediaMetadataRetriever获取网络视频的图片大小,其实获取手机本地的MP4视频的图片大小也可以,不过在小米手机获取本地视频大小时会出现权限禁止,导致获取失败。所以获取本地视频时需要修改代码。


//根据url获取音视频时长,返回毫秒    public long getDurationLong(String url,int type){        String duration = null;        MediaMetadataRetriever retriever = new MediaMetadataRetriever();        try {            //如果是网络路径            if(type == NETWORK){                retriever.setDataSource(url,new HashMap());            }else if(type == LOCAL){//如果是本地路径                retriever.setDataSource(url);            }            duration = retriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);        } catch (Exception ex) {            LogUtils.e(ex);            LogUtils.d("nihao", "获取音频时长失败");        } finally {            try {                retriever.release();            } catch (RuntimeException ex) {                LogUtils.e(ex);                LogUtils.d("nihao", "释放MediaMetadataRetriever资源失败");            }        }        if(!TextUtils.isEmpty(duration)){            return Long.parseLong(duration);        }else{            return 0;        }    }        //获取视频缩略图    private Bitmap createVideoThumbnail(String url, int type) {        Bitmap bitmap = null;        MediaMetadataRetriever retriever = new MediaMetadataRetriever();        try {            //将网络文件以及本地文件区分开来设置            if (type == NETWORK) {                retriever.setDataSource(url, new HashMap());            } else if(type == LOCAL){                retriever.setDataSource(url);            }            bitmap = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_NEXT_SYNC);        } catch (IllegalArgumentException ex) {            LogUtils.e(ex);            LogUtils.d("nihao", "获取视频缩略图失败");        } finally {            try {                retriever.release();            } catch (RuntimeException ex) {                LogUtils.e(ex);                LogUtils.d("nihao", "释放MediaMetadataRetriever资源失败");            }        }        return bitmap;    }



这个是获取视频的时长和缩略图,里面有判断本地和网络视频的区别,

 //如果是网络路径  

            if(type == NETWORK){  

                retriever.setDataSource(url,new HashMap());  

            }else if(type == LOCAL){//如果是本地路径  

                retriever.setDataSource(url);  

            }  


只是把setDataSource()的代码修改了,其他没有变化。

其实重点在于两个方法都对于传入的url进行了是否是网络的判断,那么接下来我们看看传入不同参数的setDataSource有什么不同吧,官方解释如下:


这个是我用于获取本地文件信息的方法,可以看下我标红的地方,path的定义是你传入的媒体问题的路径,所以就应该是对应的本地文件路径了。但是如果路径无效是会抛出异常的。


这个是我用于获取网络视频信息的方法,也可以看下我标红的部分,这个方法是从Android 4.0才开始有的。另外那个第二个参数是请求数据时候携带的头信息。但是我这里没有做特殊的设置了。就传递了一个map对象;


android 获取MP4文件的图片大小就讲完了。


就这么简单。



更多相关文章

  1. Android(安卓)IOS WebRTC 音视频开发总结(十二)-- sufaceview
  2. 获取SD卡下Android/data/下文件
  3. android 获取外置SD卡的路径(非挫版)
  4. Android动态加载JAR包的实现方法
  5. NiceVieoPlayer 完美视频播放器 解决黑屏坑问题
  6. os-android: 调试多媒体性能(Crack Media Perf)
  7. Android——详解Paint的setPathEffect(PathEffect effect)
  8. win7下修改AVD默认路径(2013-01-01 18:54:50)
  9. AndroidNDK工程FFmpeg(一)-- Android使用FFmpeg--Shell脚本编写与

随机推荐

  1. AndroidManifest.xml - activity 详细说
  2. Android实现发短信@彩信功能
  3. android studion Gradle多渠道打包
  4. android两种方式实现圆形图片
  5. android xml color值
  6. android Imageview 图片覆盖具体实现
  7. android常用
  8. Android Studio Exception: Could not fi
  9. Android 官方文档:(二)应用清单 —— 2.26 <
  10. Android(安卓)常用命令