- 浏览: 276714 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
wakikyou320:
楼主能否共享jar包呢?都木找到额
Android应用开发中如何使用隐藏API -
ihopethatwell:
注释/etc/apt/sources.list中 #deb h ...
ubuntu安装android 2.3 -
qq123zhz:
有wma和mp3的吗?
JAVA 读取 ASF(WMA 和 WMV)文件信息 -
zhmeup:
doveqian 写道
朋友:将android 2.3的set ...
debug调试setting源码 -
doveqian:
帮忙下:doveqian@163.com
debug调试setting源码
只提供对基本属性的读取(请参阅 MP3 的 ID3v1)。
/* 读取ASF(WMA、WMV)标签 */ public static MusicTagEntity ReadASFTag(String path) { try { char[] WMAHead = { 0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }; // WMA头部标识 char[] StandardHead = { 0x33, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }; // 标准TAG头部标识 char[] ExtendHead = { 0x40, 0xA4, 0xD0, 0xD2, 0x07, 0xE3, 0xD2, 0x11, 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5E, 0xA8, 0x50 }; // 扩展TAG头部标识 String[] StandardHeadString = { "33", "26", "B2", "75", "8E", "66", "CF", "11", "A6", "D9", "00", "AA", "00", "62", "CE", "6C" }; // 标准TAG头部标识 String[] ExtendHeadString = { "40", "A4", "D0", "D2", "07", "E3", "D2", "11", "97", "F0", "00", "A0", "C9", "5E", "A8", "50" }; // 扩展TAG头部标识 MusicTagEntity mt = new MusicTagEntity(); File f = new File(path); InputStream is = new BufferedInputStream(new FileInputStream(f)); BufferedReader br = new BufferedReader(new InputStreamReader(is, "ISO-8859-1")); // 头部需要用ASCII编码 // 读取头部判断是否为WMA文件 char[] buf = new char[16]; br.read(buf); if (Arrays.equals(buf, WMAHead)) {// 是WMA br.read(buf = new char[14]); // 跳过无用的8+6字节 br.read(buf = new char[16]); // 确定标签类型的头 // 需要判断这里是先扩展再标准还是先标准再扩展 if (Arrays.equals(buf, ExtendHead)) {// 扩展 br.read(buf = new char[8]); // 再次放过8字节(此处无用的8字节标志位) br.read(buf = new char[2]); // 扩展标签的总个数 int ExtendCount = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 for (int i = 0; i < ExtendCount; i++) { br.read(buf = new char[2]); // 扩展名称长度 int FiledNameLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[FiledNameLength]); // 读取扩展名称 String strFieldName = Common.UnicodeCharToString(buf); br.read(buf = new char[2]); // Flag,暂时不用 br.read(buf = new char[2]); // 扩展字段长度 int FiledLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[FiledLength]); // 读取扩展字段 if (strFieldName.equals("WM/TrackNumber")) mt.setTrack(Common.UnicodeCharToString(buf)); if (strFieldName.equals("WM/Track")) mt.setTrack(Common.UnicodeCharToString(buf)); else if (strFieldName.equals("WM/AlbumArtist")) mt.setArtist(Common.UnicodeCharToString(buf)); else if (strFieldName.equals("WM/AlbumTitle")) mt.setAlbum(Common.UnicodeCharToString(buf)); else if (strFieldName.equals("WM/Year")) mt.setYear(Common.UnicodeCharToString(buf)); else if (strFieldName.equals("WM/Genre")) mt.setGener(Common.UnicodeCharToString(buf)); else if (strFieldName.equals("WM/WM/GenreID")) mt.setGener(Common.UnicodeCharToString(buf)); } // 开始读取标准头 do {// 跳过空白字符 br.read(buf = new char[1]); } while ((int) buf[0] == 0); boolean IsStandartHeader = true; // 是否包含标准头部信息 if (Integer.toHexString((int) buf[0]).equals(StandardHeadString[0])) { for (int i = 1; i <= 15; i++) { br.read(buf = new char[1]); String strHex = Integer.toHexString((int) buf[0]).toUpperCase(); if (strHex.length() == 1) strHex = "0" + strHex; if (!strHex.equals(StandardHeadString[i])) { IsStandartHeader = false; break; } } if (IsStandartHeader) {// 找到标准头 br.read(buf = new char[8]); // 8字节无效内容 br.read(buf = new char[2]); // 标题长度 int TitleLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[2]); // 艺术家长度 int ArtistLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[2]); // 版权长度 int CopyrightLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[2]); // 备注长度 int CommentLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[2]); // 2字节无效内容 // 读取标题 br.read(buf = new char[TitleLength]); mt.setTitle(Common.UnicodeCharToString(buf)); // 读取艺术家 br.read(buf = new char[ArtistLength]); if (mt.getArtist().equals("")) // 如果扩展属性中没有此信息,则采用 mt.setArtist(Common.UnicodeCharToString(buf)); br.read(buf = new char[CopyrightLength]); // 跳过版权说明 // 读取备注 br.read(buf = new char[CommentLength]); mt.setComment(Common.UnicodeCharToString(buf)); } } } else if (Arrays.equals(buf, StandardHead)) {// 标准 br.read(buf = new char[8]); // 8字节无效内容 br.read(buf = new char[2]); // 标题长度 int TitleLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[2]); // 艺术家长度 int ArtistLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[2]); // 版权长度 int CopyrightLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[2]); // 备注长度 int CommentLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[2]); // 2字节无效内容 // 读取标题 br.read(buf = new char[TitleLength]); mt.setTitle(Common.UnicodeCharToString(buf)); // 读取艺术家 br.read(buf = new char[ArtistLength]); mt.setArtist(Common.UnicodeCharToString(buf)); br.read(buf = new char[CopyrightLength]); // 跳过版权说明 // 读取备注 br.read(buf = new char[CommentLength]); mt.setComment(Common.UnicodeCharToString(buf)); // 开始读取扩展头 do {// 跳过空白字符 br.read(buf = new char[1]); } while ((int) buf[0] == 0); boolean IsExtendHeader = true; // 是否包含标准头部信息 if (Integer.toHexString((int) buf[0]).equals(ExtendHeadString[0])) { for (int i = 1; i <= 15; i++) { br.read(buf = new char[1]); String strHex = Integer.toHexString((int) buf[0]).toUpperCase(); if (strHex.length() == 1) strHex = "0" + strHex; if (!strHex.equals(ExtendHeadString[i])) { IsExtendHeader = false; break; } } if (IsExtendHeader) {// 找到扩展头 br.read(buf = new char[8]); // 再次放过8字节(此处无用的8字节标志位) br.read(buf = new char[2]); // 扩展标签的总个数 int ExtendCount = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 for (int i = 0; i < ExtendCount; i++) { br.read(buf = new char[2]); // 扩展名称长度 int FiledNameLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[FiledNameLength]); // 读取扩展名称 String strFieldName = Common.UnicodeCharToString(buf); br.read(buf = new char[2]); // Flag,暂时不用 br.read(buf = new char[2]); // 扩展字段长度 int FiledLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值 br.read(buf = new char[FiledLength]); // 读取扩展字段 if (strFieldName.equals("WM/TrackNumber")) mt.setTrack(Common.UnicodeCharToString(buf)); if (strFieldName.equals("WM/Track")) mt.setTrack(Common.UnicodeCharToString(buf)); else if (strFieldName.equals("WM/AlbumArtist")) mt.setArtist(Common.UnicodeCharToString(buf)); else if (strFieldName.equals("WM/AlbumTitle")) mt.setAlbum(Common.UnicodeCharToString(buf)); else if (strFieldName.equals("WM/Year")) mt.setYear(Common.UnicodeCharToString(buf)); else if (strFieldName.equals("WM/Genre")) mt.setGener(Common.UnicodeCharToString(buf)); else if (strFieldName.equals("WM/WM/GenreID")) mt.setGener(Common.UnicodeCharToString(buf)); } } } } br.close(); is.close(); return mt; } else {// 不是ASF格式 br.close(); is.close(); return null; } } catch (Exception e) { e.printStackTrace(); return null; } }
相关的字符编码转换方法: /* 十六进制UnicodeChar转String */ public static String UnicodeCharToString(char[] Char) { String strTemp = ""; for (int i = 1; i < Char.length; i += 2) { String s1 = Integer.toHexString((int) Char[i]); String s2 = Integer.toHexString((int) Char[i - 1]); // 长度不足补全 if (s1.length() == 1) s1 = "0" + s1; if (s2.length() == 1) s2 = "0" + s2; strTemp += s1 + s2; } return UnicodeToString(strTemp).trim(); }
/* 将十六进制Unicode字符串转为汉字(将双字节转为单个字符) */ public static String UnicodeToString(String Hex) { String enUnicode = null; String deUnicode = null; for (int i = 0; i < Hex.length(); i++) { if (enUnicode == null) enUnicode = String.valueOf(Hex.charAt(i)); else enUnicode = enUnicode + Hex.charAt(i); if (i % 4 == 3) { if (enUnicode != null) { if (deUnicode == null) deUnicode = String.valueOf((char) Integer.valueOf(enUnicode, 16).intValue()); else deUnicode = deUnicode + String.valueOf((char) Integer.valueOf(enUnicode, 16).intValue()); } enUnicode = null; } } return deUnicode; }
/* 倒序排列十六进制Unicode(用以计算该字节标识的数值) */ public static String DecodeUnicodeHex(char[] Char) { String strTemp = ""; boolean CouldContinue = true; for (int i = Char.length - 1; i >= 0; i--) { String strHex = Integer.toHexString((int) Char[i]); if (strHex.length() == 1) strHex = "0" + strHex; if (strHex.equals("00") && CouldContinue) continue; else { strTemp += strHex; CouldContinue = false; } } return strTemp; }
此外还需要一个用于接收信息的类(MusicTagEntity.java): package *; //请自行填写 public class MusicTagEntity { private String Album = ""; // 专辑名称 private String Title = ""; // 歌曲标题 private String Gener = ""; // 流派 private String Artist = ""; // 艺术家 private String Year = ""; // 年份 private String Track = ""; // 音轨号 private String Lyric = ""; // 歌词 private String Comment = ""; // 备注 public String getAlbum() { return Album; } public void setAlbum(String album) { Album = album; } public String getTitle() { return Title; } public void setTitle(String title) { Title = title; } public String getGener() { return Gener; } public void setGener(String gener) { Gener = gener; } public String getArtist() { return Artist; } public void setArtist(String artist) { Artist = artist; } public String getYear() { return Year; } public void setYear(String year) { Year = year; } public String getTrack() { return Track; } public void setTrack(String track) { Track = track; } public String getLyric() { return Lyric; } public void setLyric(String lyric) { Lyric = lyric; } public String getComment() { return Comment; } public void setComment(String comment) { Comment = comment; } }
发表评论
-
Android 分包导致报错ClassNotFoundException
2017-11-09 17:23 957http://blog.csdn.net/daitu_lian ... -
堆栈存值关系
2017-06-22 17:49 456http://www.cnblogs.com/iliuyuet ... -
Java 堆和栈的区别
2017-04-20 13:32 4021、概述 在Java中,内存分为两种,一种是栈内存,另一种就 ... -
序列化和反序列化
2017-04-17 13:31 338http://www.infoq.com/cn/article ... -
Java序列化与反序列化
2017-04-17 11:48 282http://blog.csdn.net/wangloveal ... -
分享文件到微信
2017-02-13 11:07 957/** * 分享图片给好友 * ... -
material design
2016-12-17 20:39 384可以看看 appCompat http://baike.ba ... -
gson整形(1)被转为double(1.0)解决方法
2016-10-26 17:43 1699private static final Gson g ... -
退出应用
2016-04-22 16:07 542如果处在安全模式,桌面没有你测试的应用图标或小米android ... -
学习记录
2016-01-12 15:15 3051,首先推荐http://blog.csd ... -
Android Eclipse JNI 调用 .so文件加载问题
2015-12-04 19:40 1021背景:对于Android工程 Eclipse里编译好的.so文 ... -
eclipse问题记录
2015-10-21 09:39 464如果你的linux机子是32位的,那么运行android模拟器 ... -
魅族MX adb调试
2015-10-20 19:11 2807魅族MX系列手机打开usb调试后链接不上电脑, 1.在拨号键盘 ... -
相关东西
2015-09-29 18:33 431相关东西 http://www.jobui.com/mians ... -
Android性能优化典范
2015-09-29 14:14 711http://hukai.me/android-perform ... -
Ubuntu环境安装Gradle
2015-09-23 11:03 888AndroidStudio使用全新的构建系列—–Gradle。 ... -
leetcode
2015-09-08 18:11 528一、String.toCharArray数据转换成字符数组 p ... -
Changing SmartGit Free Trial License to Non-Commercial
2015-09-06 11:10 1033By weuo On March 16, 2013 · Add ... -
ubuntu配置adb
2015-08-13 10:28 9141、配置环境变量 进入终端,输入 sudo gedit ... -
webview使用
2015-04-23 21:54 738<p class="agre ...
相关推荐
mmwrite 能够写入 AVI、WMV、WMA、ASF 文件。 对于 AVI 文件,您可以从可用的编解码器中进行选择以压缩音频和视频流。 对于 WMV、WMA 和 ASF,编码默认为 Windows Media 9 44100Hz 16 位立体声 98% 质量的音频和 ...
VB读取流媒体文件信息,程序是基于MediaInfo.dll组件来实现,可以保存流媒体信息到 txt文件,可以读取出媒体比率、时长、编码类型、屏幕比率、采样率、字节数、文件类型等详细信息,获取的内容比较多,不列举了,...
福利来了,delphi获取音视频媒体文件信息,亲测支持D7和XE7。支持音频文件(*.ACC;*.AC3;*.APE;*.DTS;*.FLAC;*.M4A;*.MKA;*.MP2;*.MP3;*.MPA;*.PMC;*.OFR;*.OGG;*.RA;*.TTA;*.WAV;*.WMA;);视频文件(*.WMV;*.ASF;*....
把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA; 把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB; 把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264; 把各种视频格式转换成SWF、FLV...
它几乎涵盖了所有流行的影音多媒体文件格式, 包括AVI, Mpg, RM, RMVB, 3GP, MP4, AMV, Mpeg, Mpeg1, Mpeg2, Mpeg4, VCD, SVCD, DVD, XVID, DivX, ASF, WMV, SWF, IPOD, PSP, GIF, MJPEG, QuickTime, MOV, FLV, MKV,...
把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA; 把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB; 把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264; 把各种视频格式转换成SWF、FLV...
它几乎涵盖了所有流行的影音多媒体文件格式, 包括AVI, Mpg, RM, RMVB, 3GP, MP4, AMV, Mpeg, Mpeg1, Mpeg2, Mpeg4, VCD, SVCD, DVD, XVID, DivX, ASF, WMV, SWF, IPOD, PSP, GIF, MJPEG, QuickTime, MOV, FLV, MKV,...
它几乎涵盖了现在所有流行的影音多媒体体文件的格式, 包括AVI, Mpg, RM, RMVB, 3GP, MP4, Mpeg, Mpeg1, Mpeg2, Mpeg4, VCD, SVCD, DVD, DivX, ASF, WMV, SWF以及 QuickTime MOV/MP4。视频转换大师(WinMPG Video ...
matlab开发-mmwrite。从mmread读取的电影中写入avi/asf/wmv/wma文件
它几乎涵盖了所有流行的影音多媒体文件格式, 包括AVI, Mpg, RM, RMVB, 3GP, MP4, AMV, Mpeg, Mpeg1, Mpeg2, Mpeg4, VCD, SVCD, DVD, XVID, DivX, ASF, WMV, SWF, IPOD, PSP, GIF, MJPEG, QuickTime, MOV, FLV, MKV,...
它几乎涵盖了所有流行的影音多媒体文件格式, 包括AVI, Mpg, RM, RMVB, 3GP, MP4, AMV, Mpeg, Mpeg1, Mpeg2, Mpeg4, VCD, SVCD, DVD, XVID, DivX, ASF, WMV, SWF, IPOD, PSP, GIF, MJPEG, QuickTime, MOV, FLV, MKV,...
3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA;把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB;把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264;把各种视频格式转换成SWF、FLV、GIF、MOV、MKV;支持读取DVD光盘, 以及...
强纠错,完美支持 DVD/VCD/RM/ASF/WMA/WMV/MOV 等上百种视音频格式的播放器。支持网络流媒体在线播放,流畅播放各种无文件影碟,立体环绕超强震撼!功能说明: 一、网络播放全面兼容 *支持网络流媒体,在线播放...
把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA; 把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB; 把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264; 把各种视频格式转换成SWF、FLV...
把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA; 把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB; 把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264; 把各种视频格式转换成SWF、FLV...
把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA; 把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB; 把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264; 把各种视频格式转换成SWF、FLV...
把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA; 把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB; 把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264; 把各种视频格式转换成SWF、FLV...
把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA; 把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB; 把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264; 把各种视频格式转换成SWF、FLV...
把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA; 把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB; 把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264; 把各种视频格式转换成SWF、FLV...
TS,TP,TRP,VRO,WMV,ASF,WTV,WEBM,DVD和蓝光文件,并转换他们许多不同的视频格式:MP4,M4V,AVI,MPG,WMV,3GP,3G2,SWF,MOV,FLV,WEBM,M2TS,MTS,RM,MKV,OGV,TS,DV,ASF,动画GIF,VOB,等我们向...