zoukankan      html  css  js  c++  java
  • Android MediaMetadataRetriever 读取多媒体文件信息,元数据(MetaData)

    音乐播放器通常需要获取歌曲的专辑、作者、标题、年代等信息,将这些信息显示到UI界面上。

    1、一种方式:解析媒体文件  

    命名空间:android.media.MediaMetadataRetriever 

    android提供统一的接口MediaMetadataRetriever解析媒体文件、获取媒体文件中取得帧和元数据(视频/音频包含的标题、格式、艺术家等信息)。

    1   MediaMetadataRetriever mmr = new MediaMetadataRetriever();  
    2   String str = getExternalStorageDirectory() + "music/hetangyuese.mp3";
    
    3   mmr.setDataSource(str);  
    4   // api level 10, 即从GB2.3.3开始有此功能  
    5   String title = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); 
    6   // 专辑名
    7   String album = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);  
    8   // 媒体格式
    9   String mime = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE);  
    10  // 艺术家
    11  String artist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);  
    12  // 播放时长单位为毫秒  
    13  String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
    14  // 从api level 14才有,即从ICS4.0才有此功能  
    15  String bitrate = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE);
    16  // 路径
    17  String date = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE);  

    (1)关于视频缩略图:

    2.2 之后:因为用了ThumbnailUtils类:

    1 Bitmap  b = ThumbnailUtils.createVideoThumbnail(path,Video.Thumbnails.MICRO_KIND);  
    2 ImageView iv = new ImageView(this);  

    2.2 之前:

    使用MediaMetadataRetriever这个类;还可以通过getFrameAtTime方法取得指定time位置的Bitmap,即可以实现抓图(包括缩略图)功能

    但是 里面有个问题 
    1.0之后 这个类被隐藏了 貌似2.3之后这个类又出现了,但是还可以直接copy源码进去使用:http://blog.csdn.net/lostinai/article/details/7734699 (教程)

     1  // 对于视频,取第一帧作为缩略图,也就是怎样从filePath得到一个Bitmap对象。
     2  private Bitmap createVideoThumbnail(String filePath) {
     3  Bitmap bitmap = null;
     4  MediaMetadataRetriever retriever = new MediaMetadataRetriever();
     5  try {
     6     retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
     7     retriever.setDataSource(filePath);
     8     bitmap = retriever.captureFrame();
     9  } catch(IllegalArgumentException ex) {
    10     // Assume this is a corrupt video file
    11  } catch (RuntimeException ex) {
    12     // Assume this is a corrupt video file.
    13  } finally {
    14     try {
    15        retriever.release();
    16     } catch (RuntimeException ex) {
    17        // Ignore failures while cleaning up.
    18     }
    19   }
    20   return bitmap;
    21 }

    (2)关于音乐缩略图:

     1  // 对于音乐,取得AlbumImage作为缩略图,还是用MediaMetadataRetriever
     2  private Bitmap createAlbumThumbnail(String filePath) {
     3  Bitmap bitmap = null;
     4  MediaMetadataRetriever retriever = new MediaMetadataRetriever();
     5  try {
     6      retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
     7      retriever.setDataSource(filePath);
     8      byte[] art = retriever.extractAlbumArt();
     9      bitmap = BitmapFactory.decodeByteArray(art, 0, art.length);
    10  } catch(IllegalArgumentException ex) {
    11  } catch (RuntimeException ex) {
    12  } finally {
    13      try {
    14         retriever.release();
    15      } catch (RuntimeException ex) {
    16         // Ignore failures while cleaning up.
    17      }
    18   }
    19   return bitmap;
    20 }

    注意:直接得到Bitmap对象,把图片缩小到合适大小就OK。

    这样获取出来的,信息有时候可能有乱码:

    1、Java如何获取文件编码格式  (使用第三方库进行处理)

    2、自己判断字符串是否有乱码,然后自行处理。

     1 private boolean isMessyCode(String strName) {
     2         try {
     3             Pattern p = Pattern.compile("\s*|	*|
    *|
    *");
     4             Matcher m = p.matcher(strName);
     5             String after = m.replaceAll("");
     6             String temp = after.replaceAll("\p{P}", "");
     7             char[] ch = temp.trim().toCharArray();
     8 
     9             int length = (ch != null) ? ch.length : 0;
    10             for (int i = 0; i < length; i++) {
    11                 char c = ch[i];
    12                 if (!Character.isLetterOrDigit(c)) {
    13                     String str = "" + ch[i];
    14                     if (!str.matches("[u4e00-u9fa5]+")) {
    15                         return true;
    16                     }
    17                 }
    18             }
    19         } catch (Exception e) {
    20             e.printStackTrace();
    21         }
    22 
    23         return false;
    24     }
    检查字符串是否乱码,乱码情况下要做相应的处理

    2、二种方式:读取媒体文件数据库(避免乱码)

    创建java bean: 

     1 public class MediaInfo {  
     2         private int playDuration = 0;  
     3         private String mediaName = "";  
     4         private String mediaAlbum = "";  
     5         private String mediaArtist = "";  
     6         private String mediaYear = "";  
     7         private String mFileName = "";  
     8         private String mFileType = "";  
     9         private String mFileSize = "";  
    10         private String mFilePath = "";  
    11          
    12         public Bitmap getmBitmap() {  
    13                 return mBitmap;  
    14         }  
    15   
    16         public void setmBitmap(Bitmap mBitmap) {  
    17                 this.mBitmap = mBitmap;  
    18         }  
    19   
    20         private Bitmap mBitmap = null;  
    21 
    22         public String getMediaName() {  
    23                 return mediaName;  
    24         }  
    25 
    26         public void setMediaName(String mediaName) {  
    27                 try {  
    28                         mediaName =new String (mediaName.getBytes("ISO-8859-1"),"GBK");  
    29                 } catch (UnsupportedEncodingException e) {  
    30                         // TODO Auto-generated catch block  
    31                         e.printStackTrace();  
    32                 }  
    33                 this.mediaName = mediaName;  
    34         }  
    35   
    36         public String getMediaAlbum() {  
    37                 return mediaAlbum;  
    38         }  
    39   
    40         public void setMediaAlbum(String mediaAlbum) {  
    41                 try {  
    42                         mediaAlbum =new String (mediaAlbum.getBytes("ISO-8859-1"),"GBK");  
    43                 } catch (UnsupportedEncodingException e) {  
    44                         // TODO Auto-generated catch block  
    45                         e.printStackTrace();  
    46                 }  
    47                 this.mediaAlbum = mediaAlbum;  
    48         }  
    49 
    50         public String getMediaArtist() {  
    51                 return mediaArtist;  
    52         }  
    53 
    54         public void setMediaArtist(String mediaArtist) {  
    55                 try {  
    56                         mediaArtist =new String (mediaArtist.getBytes("ISO-8859-1"),"GBK");  
    57                 } catch (UnsupportedEncodingException e) {  
    58                         // TODO Auto-generated catch block  
    59                         e.printStackTrace();  
    60                 }  
    61                 this.mediaArtist = mediaArtist;  
    62         }  
    63 }  
    媒体信息bean

    操作类:

      1 public class MediaInfoProvider {  
      2   
      3         /** 
      4          * context 
      5          */  
      6         private Context mContext = null;  
      7   
      8         /** 
      9          * data path 
     10          */  
     11         private static final String dataPath = "/mnt";  
     12          
     13         /** 
     14          * query column 
     15          */  
     16         private static final String[] mCursorCols = new String[] {  
     17                         MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME,  
     18                         MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DURATION,  
     19                         MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,  
     20                         MediaStore.Audio.Media.YEAR, MediaStore.Audio.Media.MIME_TYPE,  
     21                         MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.DATA };  
     22   
     23         /** 
     24          * MediaInfoProvider 
     25          * @param context 
     26          */  
     27         public MediaInfoProvider(Context context) {  
     28                 this.mContext = context;  
     29         }  
     30   
     31         /** 
     32          * get the media file info by path 
     33          * @param filePath 
     34          * @return 
     35          */  
     36         public MediaInfo getMediaInfo(String filePath) {  
     37   
     38                 /* check a exit file */  
     39                 File file = new File(filePath);  
     40                 if (file.exists()) {  
     41                         Toast.makeText(mContext, "sorry, the file is not exit!",  
     42                                         Toast.LENGTH_SHORT);  
     43                 }  
     44                  
     45                 /* create the query URI, where, selectionArgs */  
     46                 Uri Media_URI = null;  
     47                 String where = null;  
     48                 String selectionArgs[] = null;  
     49                  
     50                 if (filePath.startsWith("content://media/")) {  
     51                         /* content type path */  
     52                         Media_URI = Uri.parse(filePath);  
     53                         where = null;  
     54                         selectionArgs = null;  
     55                 } else {  
     56                         /* external file path */  
     57                         if(filePath.indexOf(dataPath) < 0) {  
     58                                 filePath = dataPath + filePath;  
     59                         }  
     60                         Media_URI = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;  
     61                         where = MediaColumns.DATA + "=?";  
     62                         selectionArgs = new String[] { filePath };  
     63                 }  
     64                  
     65                 /* 查询 */  
     66                 Cursor cursor = mContext.getContentResolver().query(Media_URI,  
     67                                 mCursorCols, where, selectionArgs, null);  
     68                 if (cursor == null || cursor.getCount() == 0) {  
     69                         return null;  
     70                 } else {  
     71                         cursor.moveToFirst();  
     72                         MediaInfo info = getInfoFromCursor(cursor);  
     73                         printInfo(info);  
     74                         return info;  
     75                 }  
     76         }  
     77   
     78         /** 
     79          * 获取媒体信息
     80          * @param cursor 
     81          * @return 
     82          */  
     83         private MediaInfo getInfoFromCursor(Cursor cursor) {  
     84                 MediaInfo info = new MediaInfo();  
     85                  
     86                 /* file name */  
     87                 if(cursor.getString(1) != null) {  
     88                         info.setmFileName(cursor.getString(1));  
     89                 }  
     90                 /* media name */  
     91                 if(cursor.getString(2) != null) {  
     92                         info.setMediaName(cursor.getString(2));  
     93                 }  
     94                 /* play duration */  
     95                 if(cursor.getString(3) != null) {  
     96                         info.setPlayDuration(cursor.getInt(3));  
     97                 }  
     98                 /* artist */  
     99                 if(cursor.getString(4) != null) {  
    100                         info.setMediaArtist(cursor.getString(4));  
    101                 }  
    102                 /* album */  
    103                 if(cursor.getString(5) != null) {  
    104                         info.setMediaAlbum(cursor.getString(5));  
    105                 }  
    106                 /* media year */  
    107                 if (cursor.getString(6) != null) {  
    108                         info.setMediaYear(cursor.getString(6));  
    109                 } else {  
    110                         info.setMediaYear("undefine");  
    111                 }  
    112                 /* media type */  
    113                 if(cursor.getString(7) != null) {  
    114                         info.setmFileType(cursor.getString(7).trim());  
    115                 }  
    116                 /* media size */  
    117                 if (cursor.getString(8) != null) {  
    118                         float temp = cursor.getInt(8) / 1024f / 1024f;  
    119                         String sizeStr = (temp + "").substring(0, 4);  
    120                         info.setmFileSize(sizeStr + "M");  
    121                 } else {  
    122                         info.setmFileSize("undefine");  
    123                 }  
    124                 /* media file path */  
    125                 if (cursor.getString(9) != null) {  
    126                         info.setmFilePath(cursor.getString(9));  
    127                 }  
    128   
    129                 return info;  
    130         }  
    131 }  
  • 相关阅读:
    回调函数
    箭头函数和普通函数的区别?
    实现 (5).add(3).minus(2),使其输出结果为:6
    call 和 apply 的区别?哪个性能更好?
    用 JS 的 RegExp 进行正则判断,字符串内是否有特殊符号
    如何理解和描述“原型和原型链”
    JS 的防抖和节流
    Linux 服务器 关闭防火墙命令
    前端在Linux服务器搭建安装Nginx的步骤记录
    记录一些CSS的实用技巧
  • 原文地址:https://www.cnblogs.com/CharlesGrant/p/5800250.html
Copyright © 2011-2022 走看看