- 浏览: 283583 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
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 992http://blog.csdn.net/daitu_lian ... -
堆栈存值关系
2017-06-22 17:49 494http://www.cnblogs.com/iliuyuet ... -
Java 堆和栈的区别
2017-04-20 13:32 4461、概述 在Java中,内存分为两种,一种是栈内存,另一种就 ... -
序列化和反序列化
2017-04-17 13:31 373http://www.infoq.com/cn/article ... -
Java序列化与反序列化
2017-04-17 11:48 336http://blog.csdn.net/wangloveal ... -
分享文件到微信
2017-02-13 11:07 1004/** * 分享图片给好友 * ... -
material design
2016-12-17 20:39 421可以看看 appCompat http://baike.ba ... -
gson整形(1)被转为double(1.0)解决方法
2016-10-26 17:43 1747private static final Gson g ... -
退出应用
2016-04-22 16:07 580如果处在安全模式,桌面没有你测试的应用图标或小米android ... -
学习记录
2016-01-12 15:15 3381,首先推荐http://blog.csd ... -
Android Eclipse JNI 调用 .so文件加载问题
2015-12-04 19:40 1063背景:对于Android工程 Eclipse里编译好的.so文 ... -
eclipse问题记录
2015-10-21 09:39 505如果你的linux机子是32位的,那么运行android模拟器 ... -
魅族MX adb调试
2015-10-20 19:11 2853魅族MX系列手机打开usb调试后链接不上电脑, 1.在拨号键盘 ... -
相关东西
2015-09-29 18:33 458相关东西 http://www.jobui.com/mians ... -
Android性能优化典范
2015-09-29 14:14 793http://hukai.me/android-perform ... -
Ubuntu环境安装Gradle
2015-09-23 11:03 953AndroidStudio使用全新的构建系列—–Gradle。 ... -
leetcode
2015-09-08 18:11 563一、String.toCharArray数据转换成字符数组 p ... -
Changing SmartGit Free Trial License to Non-Commercial
2015-09-06 11:10 1068By weuo On March 16, 2013 · Add ... -
ubuntu配置adb
2015-08-13 10:28 9601、配置环境变量 进入终端,输入 sudo gedit ... -
webview使用
2015-04-23 21:54 781<p class="agre ...
相关推荐
本文将深入探讨如何获取WMV和ASF视频文件的信息,以及如何结合微软的ASF文档进行更复杂的操作。 WMV是一种由微软开发的流媒体视频格式,它基于ASF容器格式。ASF不仅包含视频数据,还可能包含音频、字幕等多轨道信息...
- **压缩和编码**: ASF文件支持多种编码标准,如Windows Media Audio和Video (WMA, WMV),以及MPEG-4音频/视频等。 - **分段传输**: ASF文件可被分割成多个数据块,适应网络环境的变化,保证流式传输的顺畅。 - **...
mmwrite 能够写入 AVI、WMV、WMA、ASF 文件。 对于 AVI 文件,您可以从可用的编解码器中进行选择以压缩音频和视频流。 对于 WMV、WMA 和 ASF,编码默认为 Windows Media 9 44100Hz 16 位立体声 98% 质量的音频和 ...
ASF(Advanced Systems Format)文件格式是微软在1997年推出的多媒体容器格式,用于存储数字音频、视频和图像数据。它旨在提供一个高效、灵活且可扩展的方式来存储和传输多媒体内容,尤其是在网络上。ASF文件格式的...
ASF文件可以使用WMV(Windows Media Video)和WMA(Windows Media Audio)编码。 3. **录制程序**:在MMS协议下录制ASF文件,意味着我们需要编写或使用能捕获并保存MMS流的程序。这通常涉及到网络编程,理解TCP/IP...
ASF文件可能包含Windows Media Audio (WMA) 或 Windows Media Video (WMV) 编码的数据。处理ASF文件可能涉及到多媒体编码解码、网络流媒体技术,以及相关的编程接口,例如DirectShow或GStreamer。 在源码文件列表中...
ASF是由微软公司开发的一种数字媒体容器格式,常用于流式传输音频和视频数据,例如Windows Media Audio (WMA) 和 Windows Media Video (WMV) 文件。这个代码库是用C语言编写的,这意味着它具有高度的可移植性,可以...
福利来了,delphi获取音视频媒体文件信息,亲测支持D7和XE7。支持音频文件(*.ACC;*.AC3;*.APE;*.DTS;*.FLAC;*.M4A;*.MKA;*.MP2;*.MP3;*.MPA;*.PMC;*.OFR;*.OGG;*.RA;*.TTA;*.WAV;*.WMA;);视频文件(*.WMV;*.ASF;*....
1. **WM ASF Reader**:这是DirectShow滤镜之一,专门用于读取ASF(Advanced Systems Format)文件,WMV就是基于ASF的视频格式。它能够解析WMV文件的结构,提取视频和音频流。 2. **WMAudio Decode DMO**:Digital ...
VB读取流媒体文件信息,程序是基于MediaInfo.dll组件来实现,可以保存流媒体信息到 txt文件,可以读取出媒体比率、时长、编码类型、屏幕比率、采样率、字节数、文件类型等详细信息,获取的内容比较多,不列举了,...
ASF是一种由微软设计的容器格式,常用于存储和流式传输音频和视频数据,包括Windows Media Audio(WMA)和Windows Media Video(WMV)等编码格式。wmstub.lib可能包含了解码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,...
在MATLAB开发中,`mmwrite`是一个非常重要的工具,它允许用户将从`mmread`函数读取的媒体文件(如电影)保存为其他常见的视频格式,如AVI、ASF、WMV和WMA。这个功能对于进行多媒体处理、视频分析或者需要在不同格式...
压缩包中的"ASFView"可能是另一个相关工具,可能用于查看Advanced Systems Format(ASF)文件,这是微软开发的一种容器格式,通常用于包含Windows Media Audio(WMA)和Video(WMV)文件。尽管MP3文件查看器主要处理...
把各种视频格式转换成便携视频:手机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 ...
它几乎涵盖了所有流行的影音多媒体文件格式, 包括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,...