android 写mp4文件大小,android 获取MP4文件的图片大小

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

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

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

private void getPlayTime(String mUri)

{

android.media.MediaMetadataRetriever mmr = new android.media.MediaMetadataRetriever();

try {

if (mUri != null)

{

HashMapheaders = 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,newHashMap());

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

retriever.setDataSource(url);

}

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

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

19a17b2878bc09a4914d88f3d6c8e2db.png

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

a6f48a62631527862f6019d28c87abae.png

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

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

就这么简单。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值